由于浮点和双精度有限而产生的误差
Error due to limited precision of float and double
在c++中,我使用以下代码来计算由于float和double精度有限而导致的错误的数量级:
float n=1;
float dec = 1;
while(n!=(n-dec)) {
dec = dec/10;
}
cout << dec << endl;
(在double情况下,我所做的只是在第1行和第2行中将float与double交换)
现在,当我在Unix系统上使用g++编译并运行它时,结果是
Float 10^-8
Double 10^-17
然而,当我在Windows 7上使用MinGW编译并运行它时,结果是
Float 10^-20
Double 10^-20
这是什么原因?
我想我会把我的评论作为一个答案,并对它进行扩展。这是我的假设,我可能错了
Windows上的MinGW可能试图通过将表达式的中间部分提升到x86的完整80位精度来保持精度。
因此,表达式n != (n-dec)
的两边都被求值为64位精度(80位FP有64位尾号)。
2^-64 ~ 10^-20
所以这些数字是有意义的。
Visual Studio也(默认情况下)将提升中间版本。但只能达到双精度
为什么不检查两个操作系统中float和double的大小呢?
这只是表明不同的环境使用不同的float和double大小。
根据c++规范,double必须至少和float一样大。如果您想知道系统上的类型有多大,请使用sizeof
。
你的测试似乎表明,g++对float和double(分别为32位和64位)使用不同的大小,而Windows系统上的MinGW32对两者使用相同的大小。这两个版本都符合标准,一般情况下都不能依赖这两个行为。
相关文章:
- C++将浮点指针值舍入为小数位数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在浮点中从大到小会引入更多的误差
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 算术运算的结果类似于:C浮点变量中的1/3
- 独立于实现的浮点/整数转换
- 是否可以保证浮点变量的副本将按位等效于原始副本?
- C++ - 处理几何插值中的浮点误差
- printf 的浮点格式标志 (%f) 仅适用于英文数字格式
- 如何在 +、-、* 和 / 中舍入误差后计算浮点精度
- 当应用于浮点值时,std::abs和std::fabs之间有什么区别吗
- 浮点到双精度转换的舍入误差
- 由于浮点和双精度有限而产生的误差
- 浮点数值误差.c++怎么知道0.99999982等于1 ?
- "floor"是否有可能由于浮点舍入误差而返回不准确的结果?
- 在c++中浮点表示依赖于编译器
- 浮点舍入误差
- 如何计算信息增益值以减少浮点近似误差
- C++中的函数重载.不适用于浮点,适用于双精度
- visual studio 2010 -浮点/双精度随机数的小范围,适用于整型(c++, VS2010)