假设我有一些代码,例如:
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(a/b)
的值如何,它产生的都是一些我们用作的值 N:
int s1 = ceil(N);
int s2 = ceil(N) + 0.1;
由于 ceil 总是产生一个整数值(尽管表示为 double 值),我们将始终有一些值 X,第一个产生 X.0
,第二个产生 X.1
。转换为 int
将始终截断 .1
,因此两者都会导致 X
。
如果 X 太大以至于 X.1 超出了 double 的范围,那么似乎会有一个异常。我看不出这在哪里可能。除了接近 0(溢出不是问题)外,数字的平方根总是小于输入数字。因此,在 ceil(N)+0.1 溢出之前,在 sqrt(a/b)
中用作输入的 a/b
必须已经溢出。
关于c++ - 我可以信任 ceil() 结果的实数到整数的转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984690/