我在matlab中遇到ceil函数问题。当我说" ceil(192.00)"它应该返回192。但是,当我声明变量x并将其指定为14 *(256/20)+(256/20)时,正好是192.00,ceil(x)返回193.为什么会这样?提前谢谢!
答案 0 :(得分:4)
这是由于MATLAB中的浮点运算(more info here)。正如您所指出的,值显示为为192.00
,但您未显示的是小数点后的所有数字。如果将您的值与整数192进行比较,您会发现它实际上只大于192.差异是由于浮点算术错误。
x = 14 * (256 / 20) + (256 / 20);
x - 192
2.8421709430404e-14
如果我们在评论中使用mentioned by Daniel技术,我们实际上可以看到x
的 true 值来验证它实际上是否大于192。
num2str(x, 17)
192.00000000000003
或者为了荒谬而
num2str(x, 48)
192.000000000000028421709430404007434844970703125
因为它略高,所以它会被ceil
向上舍入到193。
如果您想在ceil
中获得一点灵活性,则可以在执行ceil
之前从您的号码中减去一个小ε。这将允许一些浮点错误,并为您提供您期望的结果。
tolerance = 1e-12
ceil(x - tolerance)
192
答案 1 :(得分: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)