GNU C++ 浮点数精度

gnu c++ floating number precision

本文关键字:精度 浮点数 C++ GNU      更新时间:2023-10-16

我对浮点数有一个简单的问题,

double temp;  
std::cout.precision(std::numeric_limits<double>::digits10);
temp = 12345678901234567890.1234567890;
std::cout << (temp < std::numeric_limits<double>::max()) << std::endl;
std::cout << std::fixed << std::endl;
std::cout << temp << std::endl;

但是,我得到的输出是这样的,

1
12345678901234567168.000000000000000

temp 的值仍在双倍的范围内,但是,值完全不同。我想知道我在这里做错了什么?

谢谢。

双精度只有 15.95 个十进制数字的精度。您已经超过了值的整数部分的位数,因此最后几位数字的精度会丢失,并且小数点后缺少任何有用的数字。

您可能应该看一下以下内容:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 在对浮点值进行更多工作之前。

这并不完全不同。正确到 16 位左右。这就是您可以从double中得到的期望。

双精度只能存储有限的精度。它计算到大约 15 个十进制数字。

以下是一篇关于浮点数如何表示以及该表示的含义的有用文章: 浮点

IEEE

754对于任何给定值都不精确 - 例如 http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point.html 和 http://support.microsoft.com/kb/42980

-358974.27 无法在float上表示 http://ridiculousfish.com/blog/posts/float.html 我记得(尽管我懒得测试它(即使是像 2.2 或 2.3 这样"简单"的东西也无法准确表示为double