ceil 函数不 return 它应该做什么
ceil function doesn't return what it should
我对 matlab 中的 ceil 函数有疑问。当我说 "ceil(192.00)" 时,它应该是 returns 192。但是,当我声明一个变量 x 并将其赋值为 14*(256/20)+(256/20) 时,正好是 192.00,ceil(x) returns 193。这是为什么呢?提前致谢!
这是由于 MATLAB 中的浮点运算 (more info here)。正如您所指出的,值 看起来 是 192.00
,但是您没有显示的是小数点后的所有数字。如果将您的值与整数 192 进行比较,您会发现它实际上 只是 大于 192。不同之处在于浮点运算错误。
x = 14 * (256 / 20) + (256 / 20);
x - 192
2.8421709430404e-14
如果我们在评论中使用技术 ,我们实际上可以看到 x
的 true 值来验证它实际上更大比 192.
num2str(x, 17)
192.00000000000003
或者为了搞笑
num2str(x, 48)
192.000000000000028421709430404007434844970703125
因为略高,所以ceil
四舍五入到193。
如果你想在 ceil
中有一点灵活性,你总是可以在执行 ceil
之前从你的数字中减去一个小的 epsilon。这将允许一些浮点错误并为您提供预期的结果。
tolerance = 1e-12
ceil(x - tolerance)
192
我遇到了同样的问题,我原来的bug是:
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)
我对 matlab 中的 ceil 函数有疑问。当我说 "ceil(192.00)" 时,它应该是 returns 192。但是,当我声明一个变量 x 并将其赋值为 14*(256/20)+(256/20) 时,正好是 192.00,ceil(x) returns 193。这是为什么呢?提前致谢!
这是由于 MATLAB 中的浮点运算 (more info here)。正如您所指出的,值 看起来 是 192.00
,但是您没有显示的是小数点后的所有数字。如果将您的值与整数 192 进行比较,您会发现它实际上 只是 大于 192。不同之处在于浮点运算错误。
x = 14 * (256 / 20) + (256 / 20);
x - 192
2.8421709430404e-14
如果我们在评论中使用技术 x
的 true 值来验证它实际上更大比 192.
num2str(x, 17)
192.00000000000003
或者为了搞笑
num2str(x, 48)
192.000000000000028421709430404007434844970703125
因为略高,所以ceil
四舍五入到193。
如果你想在 ceil
中有一点灵活性,你总是可以在执行 ceil
之前从你的数字中减去一个小的 epsilon。这将允许一些浮点错误并为您提供预期的结果。
tolerance = 1e-12
ceil(x - tolerance)
192
我遇到了同样的问题,我原来的bug是:
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)