IEEE 754双精度浮点格式的二进制精度为53位,可转换为log10(2^53(~16位有效十进制数字。
如果使用双精度格式将浮点数字存储在存储器中的64位长字中,有效位为52位,隐藏位为1,,但使用更大的精度将数字输出到屏幕,那么实际从存储器读取并写入输出的数据是什么?
当单词的总长度为64位时,机器上的从内存读取操作是否只是简单地读取更多的位,并将其解释为数字有效位的加法?
例如,取数字0.1。无论使用何种精度,它都没有精确的二进制浮点表示,因为它在有效位中有一个无限重复的二进制浮点模式。
如果0.1以双倍精度存储,并以精度>16打印到屏幕上,如C++语言中所示:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double x = 0.1;
cout << setprecision(50) << "x= " << x << endl;
};
输出(在我的机器上执行时(是:
x=0.1000000000000000055511151231257827021181583404541
如果正确的舍入与2个保护位和1个粘性位一起使用,我可以信任错误5.551115123125783e-17中前三个非零二进制浮点数字给出的十进制值吗?
每个二进制分数都恰好等于某个十进制分数。如果像通常情况一样,double
是二进制浮点类型,那么每个double
数字都有一个完全相等的十进制表示。
对于以下内容,我假设您的系统使用IEEE 754 64位二进制浮点来表示double
。这不是标准要求的,但很常见。该格式中最接近0.1
的数字的精确值为0.1000000000000000055511151231257827021181583404541015625
尽管这个数字有很多数字,但它正好等于3602879701896397/255。分子和分母乘以555将其转换为十进制分数,同时增加分子中的位数。
与问题中的结果一致的一种常见方法是使用最接近格式所需位数的四舍五入。这确实将提供关于将字符串转换为double
时的舍入误差的有用信息。