就这么做了:
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位,如果这有什么区别的话。
typedef std::numeric_limits< double > dl;
cout << "\tdigits (decimal):\t" << dl::digits10 << endl;
有人能解释一下这里发生了什么吗?我认为Windows和Linux的精度位数应该是一样的,因为两者的sizeof(double)都是8。
发布于 2011-08-05 10:32:49
一旦超过了双精度数中包含的位数,就取决于编译器的库实现了。从二进制到十进制转换的不同算法将导致不同的输出。两者都不能比另一个更准确。
发布于 2011-08-05 11:05:51
当您打印出double
时,在打印出double
的确切值之前,您通常必须打印出很多很多数字。可以精确地打印出double
。例如,最接近1/3的double
的值为:
0.333333333333333314829616256247390992939472198486328125
打印出这个值需要超过小数点54位。但是人们说double
只有大约16位精度的的。怎么回事?
当您说double具有16位精度时,这意味着您至少需要16位才能使double在往返过程中幸存下来。也就是说,以下过程保留了输入数据:
double -> 16 digit decimal -> double
所以超过16的额外数字不一定是垃圾,它们只是不必要的。根据标准,它们几乎可以是任何东西--只要读取结果会返回相同的double
。
总结:我的猜测是,您在Linux上的标准库正在打印出double的精确值,而Windows库正在截断结果。这两种操作都是标准允许的。
你几乎肯定不需要一个双精度数的精确值,因为浮点数的算术通常是不精确的。
发布于 2012-12-05 05:51:50
Wikipedia entry on double precision非常简洁地定义了十进制数字和双精度值之间转换的边界错误:
这给出了15 - 17位有效小数位的精度。如果将最多包含15个有效小数的十进制字符串转换为IEEE754双精度,然后再转换回相同数量的有效小数,则最终字符串应与原始字符串匹配;如果将IEEE754双精度字符串转换为至少包含17个有效小数的十进制字符串,然后将其转换回双精度,则最终数字必须与原始数字匹配。
https://stackoverflow.com/questions/6950738
复制相似问题