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
就这样做了:
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位(您可以在任务管理器中查看)
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- C++/openCV - 为什么显示图像会产生 Linux 分割错误?(打开CV错误?
- Linux PURF工具显示怪异的缓存结果
- Linux C LIBEV官方示例显示了冗余控制台行为
- 在没有任何外部库的情况下,是否可以在c++/linux的窗口中显示bmp图像
- Linux Flex gcc 编译失败,并显示"未定义对 'TclReError'的引用"
- 如何在Linux终端的目录下显示详细的文件信息?-C++
- C++函数系统(命令)的输出在Linux终端中不显示颜色
- 如何在Linux的GDB/Neiver中显示C++STL容器
- Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新表单
- 在Qt错误显示:"Fault Module Name: Qt5Cored.dll"在win 7和调试时:"segmentation fault"在CentOS Linux和Win 7中
- 在Linux上,静态变量和全局变量在动态库和静态库中显示不同的地址
- Linux C++:如何在stdout之外显示文本应用程序输出
- 在LINUX中使用C++显示特定目录中包含的文件
- 如何使用QT在Linux上正确显示unicode符号
- 你能建议文本编辑器(linux),有良好的定制突出显示
- c++中double的精确位数在windows和Linux中不同.为什么?Linux显示超过20个非零精度数字
- Linux强制应用程序在特定显示器上全屏显示
- Linux中的C/ c++编辑器在输入时显示错误吗?
- 简单的库,用于在 Linux 上以C++显示 2D 图像