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

时间:2018-09-02 23:12:45

标签: casting rounding ceil

`当我运行以下代码时,它给出的答案是16777216,但应该给出16777215的原因。

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

2 个答案:

答案 0 :(得分:0)

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

如果不清楚,Ceil会四舍五入到下一个更大的整数。

答案 1 :(得分:0)

好吧,起初我误解了你的问题;标题听起来像是您在问为什么Ceiling(天花板功能)不正确。

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

在第二行中,将文字2强制转换为浮点值,以便编译器在计算d / 2时也将d转换为浮点值。由于内部表示的原因,浮点数(单精度浮点数)受到其可以准确表示的值的限制。我通常假设精度不超过7位数,如果我需要的精度更高,则使用双精度。无论如何,如果您查看范围为[16777217,33554432]的此链接(https://en.wikipedia.org/wiki/Single-precision_floating-point_format)整数,将其舍入为2的倍数。因此,当编译器将d转换为float时,它变为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<<" ";