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

问题描述 投票:-1回答:2

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

    int d=33554431;
    d=d-ceil(d/(float)2);
    cout<<d<<" ";
casting rounding ceil
2个回答
0
投票

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

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

在第二行中,将文字2转换为浮点值,以便编译器在计算d / 2时也将d转换为浮点数。由于内部表示,float(单精度浮点)在它们可以准确表示的值中受到限制。我通常假设精度不超过7位,如果我需要更多,我使用双打。无论如何,如果你看一下[16777217,33554432]范围内的这个链接(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<<" ";

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.