天花板操作给出了错误的答案

Ceiling Operation Gives Wrong answer

`当我 运行 以下代码时,它给我的答案是 16777216 但它应该给出 16777215 为什么会这样..

    int d=33554431;
    d=d-ceil(d/(float)2);
    cout<<d<<" ";

嗯,我的计算器显示 33,554,431 / 2 实际上是 16,777,215.5,这意味着 ceil(16,777,215.5) = 16,777,216 实际上是正确的。

Ceil 向上舍入到下一个更大的整数,如果不清楚的话。

好的,一开始我误解了你的问题;标题听起来像是在问为什么 Ceiling(ceil 函数)不正确。

int d=33554431;
d=d-ceil(d/(float)2);
cout<<d<<" ";

在第二行中,您将文字 2 转换为浮点值,因此编译器在计算 d/2 时也会将 d 转换为浮点值。由于内部表示,浮点数(单精度浮点数)在它们可以准确表示的值方面受到限制。我通常假设精度不超过 7 位,如果需要更多,我会使用双精度。无论如何,如果您查看 [16777217,33554432] 范围内的 link (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) 整数,舍入为 2 的倍数。因此,当编译器将 d 转换为浮点数时,它变为 33554432。您可以看到即 运行 以下代码:

int d1 = 33554431;
float f = d1;
int d2 = f;

cout << d1 << endl;
cout << f << endl;
cout << d2 << endl;

要修复您的原始代码,试试这个:

int d=33554431;
d=d-ceil(d/(double)2);
cout<<d<<" ";

int d=33554431;
d=d-ceil(d/2.0);
cout<<d<<" ";