C ++从长到长

时间:2014-10-04 19:41:23

标签: c++ floating-point double floating-point-conversion

如果我用c ++编写代码:

long long d = 999999998.9999999994;
cout<<d;

我得到输出:999999999(向上舍入)

但是这段代码的输出:

long long d = 999999998.9999994994;
cout<<d;

999999998(向下舍入)

是否与精确度有关。有什么方法可以改变精度。 floor()函数也提供相同的输出。

我还注意到,如果我将值8.99999949948.9999999994分配给d(上面的变量)。输出为8

2 个答案:

答案 0 :(得分:10)

{p> 999999998.9999999994double中无法准确表示,因此实际值是999999998.9999999994任意一侧的两个可表示数字之一 - 999999998.99999988079071044921875或{{1 (假设IEEE-754 999999999格式),以实现定义的方式选择。默认情况下,大多数系统将舍入到最近,生成binary64

最终结果是,当您编写999999999时,在这些系统上,最终会产生与编写999999998.9999999994完全相同的效果。因此,后续转换产生999999999.0 - 从浮点数到整数的转换总是截断,但是没有什么可以截断。

使用999999999,最接近的可表示数字为999999998.9999994994999999998.999999523162841796875。截断后,任何一个都会生成999999998.99999940395355224609375。同样,对于999999998,最接近的可表示数字为8.99999999948.999999999399999950355777400545775890350341796875,其中任何一个都会在截断后生成8.9999999994000017267126168007962405681610107421875

答案 1 :(得分:4)

long long d = 999999998.9999999994; 

999999998.9999999994可以表示的double最接近的值是999999999.0 - 请记住,浮点的精度有限;)。
因此,截断小数位会产生999999999,这就是d中保存的内容。

使用带有L - 后缀的文字确实导致999999998 d保存long double具有更高的精确度。

long long d = 999999998.9999994994;

999999998.9999994994可以代表double的最接近值实际上低于999999999 - 我机器上的999999998.999999523。随后截断小数位会产生999999998,并存储在d