c++中double的精确位数在windows和Linux中不同.为什么?Linux显示超过20个非零精度数字

Number of precision digits for double in C++ different in windows and Linux. Why? Linux shows more than 20 non-zero precision digits

本文关键字:Linux 显示 为什么 20个 数字 精度 c++ windows double      更新时间:2023-10-16

就这样做了:

double val1=numeric_limits<double>::max();
cout.precision(70);
cout<<"nVal1: "<<val1;

在Windows中,我开始在17位后得到0(小数点后16位)。然而,在Linux中,随着我不断增加count .precision(NUMBER),越来越多的数字不断显示,它们不是零。

同样,在Windows和Linux上运行下面的代码都会显示'15'。如果有区别的话,Windows系统是32位,Linux系统是64位。

typedef std::numeric_limits< double > dl;
cout << "tdigits (decimal):t" << dl::digits10 << endl;
有谁能解释一下这里发生了什么事吗?我认为精确数字的数量将在Windows &Linux,因为sizeof(double)在它们上都是8。

当您打印出double时,您通常需要打印出很多很多数字才能打印出double的确切值。可以精确地打印出double。例如,最接近1/3的double的值为:

0.333333333333333314829616256247390992939472198486328125

打印该值需要小数点后54位。但是人们说double只有大约 16位精度。到底发生了什么事?

当你说双精度数有16位精度时,这意味着你需要至少16位才能使双精度数在一次往返中存活下来。也就是说,以下过程保留输入数据:

double -> 16 digit decimal -> double

所以超过16的额外数字不一定是垃圾,它们只是不必要的。根据标准,它们几乎可以是任何东西——只要读取结果会给你相同的double

总结:我的猜测是Linux上的标准库正在打印出double的确切值,而Windows库正在截断结果。这两种操作都是标准所允许的。

几乎可以肯定,无论如何都不需要双精度类型的精确值,因为浮点数的运算通常是不精确的。

一旦您确定了双精度类型中包含的位数,那么您就要受编译器库实现的摆布了。将二进制转换为十进制的不同算法将导致不同的输出。

维基百科关于双精度的条目非常简洁地定义了十进制数字和双精度值之间转换的边界错误:

给出15 - 17位有效十进制数字的精度。如果一个最多有15位有效小数的十进制字符串被转换为IEEE 754双精度,然后转换回相同的数字的有效小数,则最终字符串应匹配原始的;如果将IEEE 754双精度转换为a至少有17位有效小数的十进制字符串,然后进行转换返回double,则最终数字必须与原始数字匹配。

我想你在windows上安装了32位的g++版本,在linux上安装了64位的g++版本。只需验证您正在运行的程序,如果它是32位或64位(您可以在任务管理器中查看)