C++从双到长

C++ double to long long

本文关键字:C++      更新时间:2023-10-16

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

long long d = 999999998.9999999994;
cout<<d;

我得到输出:999999999(取整)

但是这个代码的输出:

long long d = 999999998.9999994994;
cout<<d;

999999998(向下取整)

这与精确性有关吗。有什么办法可以改变精度吗。floor()函数也给出相同的输出。

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

999999998.9999999994double中不完全可表示,因此实际值是999999998.9999999994两侧的两个可表示数字之一——999999998.99999988079071044921875999999999(假设IEEE-754 binary64格式),以实现定义的方式选择。默认情况下,大多数系统将四舍五入到最接近的值,生成999999999

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

对于999999998.9999994994,最接近的可表示数是999999998.999999523162841796875999999998.99999940395355224609375。任意一个在截断后产生CCD_ 21。类似地,对于8.9999999994,最接近的可表示数是8.9999999993999999503557774005457758903503417968758.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中。

相关文章:
  • 没有找到相关文章