`当我运行以下代码时,它给出了我的答案为16777216,但它应该给16777215为什么这样...
int d=33554431;
d=d-ceil(d/(float)2);
cout<<d<<" ";
好的,起初我误解了你的问题;标题听起来像你在问为什么天花板(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<<" ";
好吧,我的计算器说33,554,431 / 2实际上是16,777,215.5,这意味着ceil(16,777,215.5)= 16,777,216实际上是正确的。
如果不清楚的话,Ceil会向上舍入到下一个更大的整数。