C++从双到长
C++ double to long long
如果我用c++编写代码:
long long d = 999999998.9999999994;
cout<<d;
我得到输出:999999999
(取整)
但是这个代码的输出:
long long d = 999999998.9999994994;
cout<<d;
是999999998
(向下取整)
这与精确性有关吗。有什么办法可以改变精度吗。floor()
函数也给出相同的输出。
我还注意到,如果我将值8.9999994994
或8.9999999994
分配给d
(上面的变量)。输出为8
。
999999998.9999999994
在double
中不完全可表示,因此实际值是999999998.9999999994
两侧的两个可表示数字之一——999999998.99999988079071044921875
或999999999
(假设IEEE-754 binary64
格式),以实现定义的方式选择。默认情况下,大多数系统将四舍五入到最接近的值,生成999999999
。
最终的结果是,在这些系统上,当你写999999998.9999999994
时,它最终会产生与写999999999.0
完全相同的效果。因此,随后的转换产生999999999
——从浮点数到整数的转换总是截断的,但这里没有什么可截断的。
对于999999998.9999994994
,最接近的可表示数是999999998.999999523162841796875
和999999998.99999940395355224609375
。任意一个在截断后产生CCD_ 21。类似地,对于8.9999999994
,最接近的可表示数是8.999999999399999950355777400545775890350341796875
和8.9999999994000017267126168007962405681610107421875
,并且任何一个都将在截断后产生8
。
long long d = 999999998.9999999994;
double
可以表示的最接近999999998.9999999994
的值是999999999.0
——记住浮点的精度是有限的;)
因此,截断小数点后得到999999999
,这就是保存在d
中的内容。
使用后缀为L
的文字确实会导致999999998
保存在d
中——long double
具有更高的精度。
long long d = 999999998.9999994994;
double
可以表示的最接近999999998.9999994994
的值实际上低于999999999
——在我的机器上大约是999999998.999999523
。截断小数点后得到999999998
,并存储在d
中。
- 没有找到相关文章