c++ - 我可以信任 ceil() 结果的实数到整数的转换吗?

标签 c++ c floating-point floating-accuracy 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.0b=4.0,那么ceil的输出应该是5.00000但是什么如果它是 4.99999

类似的问题:是否有可能 100.0/4.0 的计算结果为 5.00001 然后 ceil 将其四舍五入为 6.00000?

我更喜欢用整数数学来做这个,但是 sqrt 有点搞砸了这个计划。

编辑: 关于如何更好地实现这一点的建议也将不胜感激! ab 值是整数值,因此实际代码更像是: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/

相关文章:

c++ - 如何创建C++宏来定义使用调用另一个函数的参数列表的函数?

C++ 负数左移溢出

c - #ifdef DEBUG{...} 在 opengl 中是什么意思?

C 编程 - float 条件的 while 循环的异常行为

java - 初始化浮点值时出错

c++ - boost::regex 和 std::regex 之间的不一致

c++ - 如何在结构体中声明填充?

c - scanf 使用 %f 表示整数

c++ - boost 日期时间转换和添加秒数

c - 如何解决file.exe在链表中插入一次后停止运行的问题