当使用更高的精度来显示数字而不是格式支持的数字时,会写出什么数据?

tma*_*ric 1 c++ floating-point

IEEE 754双精度浮点格式具有53位的二进制精度,其转换为log10(2 ^ 53)~16个有效十进制数字.

如果双精度格式用于在存储器中的64位长字中存储浮点数,有效位数为52位,隐藏位为1位,但使用更大的精度将数字输出到屏幕,实际上是从内存中读取数据并将其写入输出?

甚至可以读取,当字的总长度为64位时,机器上的读取存储器操作是否只是读取更多位并将它们解释为数字有效数的加法?

例如,取数字0.1.无论使用何种精度,它都没有精确的二进制浮点表示,因为它在有效数字中具有无限重复的二进制浮点模式.

如果以双精度存储0.1,并使用C++语言中的精度> 16打印到屏幕:

#include <iostream> 
#include <iomanip> 

using namespace std;

int main()
{
    double x = 0.1; 
    cout << setprecision(50) << "x= " << x << endl;
}; 
Run Code Online (Sandbox Code Playgroud)

输出(在我的机器上执行时)是:

x = 0.1000000000000000055511151231257827021181583404541

如果正确的舍入用于2个保护位和1个粘滞位,我是否可以信任错误5.551115123125783e-17中前三个非零二进制浮点数给出的十进制值?

Pat*_*han 6

每个二进制分数恰好等于某个小数部分.如果通常情况下double是二进制浮点类型,则每个double数字都具有完全相等的十进制表示.

对于以下内容,我假设您的系统使用IEEE 754 64位二进制浮点来表示double.这不是标准所要求的,但是很常见.该0.1格式中最接近的数字具有精确值0.1000000000000000055511151231257827021181583404541015625

虽然这个数字有很多位数,但它完全等于3602879701896397/2 55.将分子和分母乘以5 55将其转换为小数,同时增加分子中的位数.

与问题结果一致的一种常见方法是使用舍入到格式所需的位数的舍入值.这确实会提供有关字符串转换为舍入错误的有用信息double.

  • @tmaric:该值_is_ exact,而在十进制中,它需要55位有效数字才能准确表示,这与它不相符,只需要53位有效位(因此与IEEE 754 binary64兼容).对于一个较小的例子,考虑3/16只需要两个有效位来表示二进制浮点,但在十进制中它是"0.1875". (3认同)
  • @tmaric字符串是以分段方式构建的,在任何时候都不会超出IEEE算术的限制.对不起,我没有提到你. (2认同)