首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++中double的精度位数不同于windows和Linux。为什么?Linux显示20多个非零精度数字

C++中double的精度位数不同于windows和Linux。为什么?Linux显示20多个非零精度数字
EN

Stack Overflow用户
提问于 2011-08-05 10:20:25
回答 4查看 22.4K关注 0票数 5

就这么做了:

代码语言:javascript
运行
复制
double val1=numeric_limits<double>::max();
cout.precision(70);
cout<<"\nVal1: "<<val1;

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

此外,在Windows和Linux上运行以下代码都会显示'15‘。Windows系统是32位,Linux系统是64位,如果这有什么区别的话。

代码语言:javascript
运行
复制
typedef std::numeric_limits< double > dl;
cout << "\tdigits (decimal):\t" << dl::digits10 << endl;

有人能解释一下这里发生了什么吗?我认为Windows和Linux的精度位数应该是一样的,因为两者的sizeof(double)都是8。

EN

回答 4

Stack Overflow用户

发布于 2011-08-05 10:32:49

一旦超过了双精度数中包含的位数,就取决于编译器的库实现了。从二进制到十进制转换的不同算法将导致不同的输出。两者都不能比另一个更准确。

票数 8
EN

Stack Overflow用户

发布于 2011-08-05 11:05:51

当您打印出double时,在打印出double的确切值之前,您通常必须打印出很多很多数字。可以精确地打印出double。例如,最接近1/3的double的值为:

代码语言:javascript
运行
复制
0.333333333333333314829616256247390992939472198486328125

打印出这个值需要超过小数点54位。但是人们说double只有大约16位精度的的。怎么回事?

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

代码语言:javascript
运行
复制
double -> 16 digit decimal -> double

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

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

你几乎肯定不需要一个双精度数的精确值,因为浮点数的算术通常是不精确的。

票数 8
EN

Stack Overflow用户

发布于 2012-12-05 05:51:50

Wikipedia entry on double precision非常简洁地定义了十进制数字和双精度值之间转换的边界错误:

这给出了15 - 17位有效小数位的精度。如果将最多包含15个有效小数的十进制字符串转换为IEEE754双精度,然后再转换回相同数量的有效小数,则最终字符串应与原始字符串匹配;如果将IEEE754双精度字符串转换为至少包含17个有效小数的十进制字符串,然后将其转换回双精度,则最终数字必须与原始数字匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6950738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档