【发布时间】:2011-11-02 17:26:48
【问题描述】:
假设我有一些代码,例如:
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) < y更改为x < y * y,这样可以保留整数运算(只要y * y不会变得太大)。 -
不幸的是,
s1 != s2很有可能,即使a/b是一个完美的正方形。浮点运算是出了名的不准确,因此您获得5.00000(或任何您想要的数字)的机会非常渺茫。 -
@peachykeen 即使我们正在处理整数?
5.0可以完美地表示为浮点数,100.0和20.0也可以。 -
@Dan 如果您有一个实现,其中
100/4的计算结果接近于5,那么您肯定有问题。 -
@GMan 我会考虑的...我有
a需要分发到b盒子的物品。当a>b我想把每个盒子分成4、9、16、25等子盒子。所以s的值是比例(分别为2、3、4、5),或者是盒子沿每个维度的分割数。例如,300 个单元和 20 个盒子需要每个盒子分成 16 个(4x4)。
标签: c++ c floating-point floating-accuracy ceil