假设我有一些代码,如:我可以信任ceil()的结果的实数转换吗?
float a, b = ...; // both positive
int s1 = ceil(sqrt(a/b));
int s2 = ceil(sqrt(a/b)) + 0.1;
有没有可能是s1 != s2
?我的关注是当a/b
是一个完美的广场。例如,可能是a=100.0
和b=4.0
,那么ceil
的输出应该是5.00000
,但是如果代之以是4.99999
?
相似问题:有没有机会100.0/4.0
评估说5.00001
,然后ceil
将它舍入到6.00000
?
我宁愿这样做在整数数学,但sqrt
有点螺丝计划。
编辑:关于如何更好地实现这一点的建议,也将不胜感激!该a
和b
值是整数值,所以实际的代码更像是:ceil(sqrt(float(a)/b))
编辑:基于levis501的回答,我想我会做到这一点:
float a, b = ...; // both positive
int s = sqrt(a/b);
while (s*s*b < a) ++s;
谢谢大家!
这些计算是什么?例如,你可以将'sqrt(x)
GManNickG
不幸的是,即使“a/b”是一个完美的正方形,'s1!= s2'也是很可能的。浮点运算是非常不准确的,所以你获得'5.00000'(或者任何你想要的数字)的机会都很渺茫。 – ssube
@peachykeen即使我们正在处理整数数字? '5.0'可以完美地表示为一个浮点数,'100.0'和'20.0'也是如此。 – glglgl