Dex*_*ter 9 c++ math floating-point
我正面临将值从Double转换为int的问题.我尝试运行以下代码:
int main()
{
double val_d= 6.25e-05;
cout << (1/val_d) << endl;
unsigned int val_ui = (unsigned int ) (1/val_d);
cout << val_ui << endl;
}
Run Code Online (Sandbox Code Playgroud)
从double转换为int可能会删除小数部分,但整数部分应保持不变?
我得到的输出是:16000 15999
那么为什么这里的o/p有所不同?这只发生在fedora上.在Windows和Ubuntu上它工作正常.(两个输出都是16000)
我调整了上面的代码,得到了以下结果:
int main()
{
double val_d= 6.25e-05;
cout << (1/val_d) << endl;
double val_intermediate = (1/val_d) ;
cout << val_intermediate << endl;
unsigned int val_ui = (unsigned int ) val_intermediate;
cout << val_ui << endl;
}
Run Code Online (Sandbox Code Playgroud)
NEW OUTPUT是16000 16000 16000
Eri*_*hil 15
当源文本"6.25e-05"被解释为十进制数字并转换为double时,它不能完全表示,因为浮点值的精度有限,并且每个位的值都是2的幂,而不是十进制数字.最接近6.25e-5的IEEE 754双精度值是6.25000000000000013010426069826053208089433610439300537109375e-05,或者是十六进制浮点数0x1.0624dd2f1a9fcp-14.
当采用它的倒数时,精确的数学结果再次不能完全表示,因此必须再次舍入.最接近的双精度值是16000或0x1.f4p + 13.
C++标准允许实现评估浮点表达式,其精度高于标称类型要求.某些实现使用扩展精度,特别是Intel的80位浮点类型,它具有64位有效数字.(常规双精度具有53位有效数.)在此扩展精度中,倒数为0xf.9fffffffffffe89p + 10或15999.99999999999966693309261245303787291049957275390625.
显然,当扩展精度结果被截断为整数时,结果为15999.
将long-double结果舍入为double将产生16000.(您可以使用显式转换来加倍;您不需要将中间值分配给double对象.)
四舍五入的差异.
| 归档时间: |
|
| 查看次数: |
14668 次 |
| 最近记录: |