Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当使用比格式支持的精度更高的精度来显示数字时,会写入哪些数据?_C++_Floating Point - Fatal编程技术网

C++ 当使用比格式支持的精度更高的精度来显示数字时,会写入哪些数据?

C++ 当使用比格式支持的精度更高的精度来显示数字时,会写入哪些数据?,c++,floating-point,C++,Floating Point,具有53位的二进制精度,可转换为log102^53~16位有效十进制数字 如果使用双精度格式将浮点数存储在内存中的64位长字中,52位为有效位,1位为隐藏位,但使用更高的精度将数字输出到屏幕,那么实际从内存读取并写入输出的数据是什么 当字的总长度为64位时,机器上的“从内存读取”操作只是读取更多的位,并将其解释为数字有效位的加法,如何读取 例如,以数字0.1为例。无论使用何种精度,它都没有精确的二进制浮点表示,因为它的有效位中有一个无限重复的二进制浮点模式 如果用双精度存储0.1,则以C++语言

具有53位的二进制精度,可转换为log102^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;
}; 
我的机器在执行时的输出为:

x=0.100000000000000551151231257827021181583404541


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

每个二进制分数都与某个十进制分数完全相等。如果像通常情况一样,double是二进制浮点类型,则每个double数都具有完全相等的十进制表示形式

对于下面的内容,我假设您的系统使用IEEE 754 64位二进制浮点来表示双精度。这不是标准要求的,但非常常见。该格式中最接近0.1的数字的精确值为0.100000000000000551151231257827021181583404541015625

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


与问题结果一致的一种常见方法是使用四舍五入至最接近格式要求的位数。这确实会提供有关字符串转换为双精度时舍入误差的有用信息。

每个二进制分数都正好等于某个十进制分数。如果像通常情况一样,double是二进制浮点类型,则每个double数都具有完全相等的十进制表示形式

对于下面的内容,我假设您的系统使用IEEE 754 64位二进制浮点来表示双精度。这不是标准要求的,但非常常见。该格式中最接近0.1的数字的精确值为0.100000000000000551151231257827021181583404541015625

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


与问题结果一致的一种常见方法是使用四舍五入至最接近格式要求的位数。这确实会提供有关字符串转换为双精度时舍入错误的有用信息。

这在很大程度上取决于编程语言/操作系统/系统库。你是不是特别问C++?如果是这样的话,可能值得添加相关标签。但即使如此,语言规范也没有明确说明应该在这里输出什么。是的,我主要对C++感兴趣。那么,在p-1数字之后读取什么取决于编程语言?如果我有两个连续存储在内存中的数字,并且我继续读取p-1之外的第一个数字,那么下一个数字的开头会被读取吗?否:从内存中读取的总是双精度值的64位8字节。接下来发生的事情将取决于语言和系统:将IEEE 754 binary64值转换为十进制输出字符串的细节是混乱的,在准确性、速度和易于实现之间存在权衡。更不用说,一些主流语言C、C++、Python在第一个位置不做任何关于浮点格式是IEEE 754的假设。好,如果转换为字符串是语言依赖的,最好把第1-1个数字作为垃圾处理,对吗?这取决于你的需要。例如,如果您要将这些二进制64值以十进制形式写入文本文件,希望稍后能将其读回并获得与开始时完全相同的值,则需要写入17位有效数字以确保恢复原始值。您还需要从实现中得到一些保证——理想情况下是关于正确舍入的保证,但是较弱的保证就足够了
将高度依赖于编程语言/操作系统/系统库。你是不是特别问C++?如果是这样的话,可能值得添加相关标签。但即使如此,语言规范也没有明确说明应该在这里输出什么。是的,我主要对C++感兴趣。那么,在p-1数字之后读取什么取决于编程语言?如果我有两个连续存储在内存中的数字,并且我继续读取p-1之外的第一个数字,那么下一个数字的开头会被读取吗?否:从内存中读取的总是双精度值的64位8字节。接下来发生的事情将取决于语言和系统:将IEEE 754 binary64值转换为十进制输出字符串的细节是混乱的,在准确性、速度和易于实现之间存在权衡。更不用说,一些主流语言C、C++、Python在第一个位置不做任何关于浮点格式是IEEE 754的假设。好,如果转换为字符串是语言依赖的,最好把第1-1个数字作为垃圾处理,对吗?这取决于你的需要。例如,如果您要将这些二进制64值以十进制形式写入文本文件,希望稍后能将其读回并获得与开始时完全相同的值,则需要写入17位有效数字以确保恢复原始值。您还需要从实现中获得一些保证——理想情况下,保证正确的舍入,但较弱的保证就足够了。在该格式中,最接近0.1的数字具有确切的值:两个问题。1.当双精度格式IEEE 754只有52位长的有效位,这意味着该数字中第16位之后的小数位值根本不由该格式表示时,该值如何精确?2.最接近0.1的数字已经是在“四舍五入到最近值”模式下对0.1执行的四舍五入操作的结果,因此它不精确。@tmaric:该值是精确的,而在十进制中,它需要55位有效数字才能精确表示,这与它并不矛盾,它只需要53个有效位,因此与IEEE 754 binary64兼容。对于一个较小的例子,考虑到3/16只需要两个有效位来表示二进制浮点,但是在十进制中,它是0.1875。所有这些都与0.10000000000000055115123125782702118158340451015625的值可以用IEEE 754 binary64格式精确表示的说法不一致。@tmaric我认为该标准没有说明您将获得的确切输出,它取决于编译器。但是,生成精确输出的过程是一个众所周知的问题,我希望任何编译器都能解决这个问题。所有字符串都不会是垃圾。@t如果字符串是以分段方式构建的,则任何时候都不会超出IEEE算法的限制。很抱歉,我没有参考资料给你。该格式中最接近0.1的数字有确切的值:两个问题。1.当双精度格式IEEE 754只有52位长的有效位,这意味着该数字中第16位之后的小数位值根本不由该格式表示时,该值如何精确?2.最接近0.1的数字已经是在“四舍五入到最近值”模式下对0.1执行的四舍五入操作的结果,因此它不精确。@tmaric:该值是精确的,而在十进制中,它需要55位有效数字才能精确表示,这与它并不矛盾,它只需要53个有效位,因此与IEEE 754 binary64兼容。对于一个较小的例子,考虑到3/16只需要两个有效位来表示二进制浮点,但是在十进制中,它是0.1875。所有这些都与0.10000000000000055115123125782702118158340451015625的值可以用IEEE 754 binary64格式精确表示的说法不一致。@tmaric我认为该标准没有说明您将获得的确切输出,它取决于编译器。但是,生成精确输出的过程是一个众所周知的问题,我希望任何编译器都能解决这个问题。所有字符串都不会是垃圾。@t如果字符串是以分段方式构建的,则任何时候都不会超出IEEE算法的限制。对不起,我没有推荐信给你。