ceil函数返回的结果与预期不符。

3

我在Matlab中使用ceil函数时遇到了问题。当我输入"ceil(192.00)"时,它返回的结果是192,这是正确的。然而,当我声明一个变量x,并将其赋值为14*(256/20)+(256/20),即恰好为192.00时,ceil(x)返回的结果却是193。这是为什么呢?谢谢!

2个回答

4
这是由于 MATLAB 中的浮点运算所致(更多信息在此处)。正如您所指出的那样,该值似乎192.00,但您没有展示小数点后的所有数字。如果您将该值与整数192进行比较,您会发现它实际上仅仅比192大一点点。差异是由于浮点运算误差造成的。
x = 14 * (256 / 20) + (256 / 20);
x - 192

    2.8421709430404e-14

如果我们使用Daniel提到的技术在评论中,我们实际上可以看到xtrue值,以验证它确实大于192。

num2str(x, 17)

    192.00000000000003

或者为了荒谬之故

num2str(x, 48)

    192.000000000000028421709430404007434844970703125

因为这个数稍微大一点,所以会通过ceil函数向上舍入为193。

如果您想在ceil函数中有一些灵活性,您可以在执行ceil函数之前从您的数字中减去一个小的epsilon值。这将允许一些浮点误差,并给您期望的结果。

tolerance = 1e-12
ceil(x - tolerance)

    192

更改了格式,但仍未显示小数。我使用另一个不能为整数的数字进行了检查,看到了12个小数位,但我的数字恰好是192。 - Vlad Iordache
1
@Vlad Iordache:格式化长整型不够,你需要17位数字。结果是192.00000000000003 - Daniel
1
@Daniel 感谢你分享链接!我一直在想如何显示更多位数。 - Suever

0

我遇到了同样的问题,我的原始错误是:

ceil(168*1.55/1.55)

ans = 

169

我通过减去一个小数解决了这个问题。
ceil(168*1.55/1.55 - 0.001)

注意,最好在一系列计算之后再进行减法运算。

ceil(168*1.55/1.55 - 0.001)

如果在计算过程中进行减法运算,可能会得到错误的结果。例如:(168是我的变量位置,最好不要更改变量)

ceil((168-0.00000000000001)*1.55/1.55)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接