浮点值计算出现小数点错误

ghui 2005-10-29 09:41:50
//相同精度下计算,
double a, b, c, d, f;
a = 0.38;
b = 0.68;
c = 8.38;
d = 86.38;
f = 100.0;

double x = f - a - b - c - d;

我自以为是 x = 4.18
结果却是 x = 4.18000000000001

由于一些数据的小数点后位数会高达24位,如何避免这种精度误差

*在我的印象中,C++在相同的精度下计算,似乎不会出现这种问题。
...全文
224 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivony 2005-11-16
  • 打赏
  • 举报
回复
这牵涉到架构平台,甚至不同的CPU对浮点数的运算都不同,很难解释,但是有一点可以肯定,浮点数决不可用来做精确计算,浮点数的精度损失无法避免且无法被程序察觉。


你要做精确计算必须自己写结构,重载+-*/运算符即可。
Ivony 2005-11-16
  • 打赏
  • 举报
回复
不论有没有超过精度范围都可能造成误差。

这个是不用解释的,因为浮点数没有保证在不超过精度的情况下就不会有误差。
ghui 2005-11-16
  • 打赏
  • 举报
回复
在老的 Turbo C 2.0中测试,发现精度也没有出现问题
#include <io.h>
void main()
{
double a, b, c, d, e, f, x;
a = 0.38;
b = 0.68;
c = 8.38;
d = 86.38;
f = 100.0;
x = f - a - b - c - d - e;
sprintf("\nx=%f\n", x);
}

结果为 4.180000

To: Ivony() ( ) , 请解释一下!
ghui 2005-11-16
  • 打赏
  • 举报
回复
C里面是这么定义双精度实型(double):占用64位2进制,数据范围 (+/-) 10^((+/-)308)。数据按照整数和小数两部分保存,提供16位有效数字。

这里面的数字的位数范围仅仅为4~5位,还没有超出它的有效数字范围,所以理论上不应该出现位数误差。

既然大家都认为这里的精度误差是正常的现象,谁能解释一下!
Ivony 2005-11-02
  • 打赏
  • 举报
回复
不是从C语言过来的,或者C语言学的不透彻的都容易犯这个错误。

而这种错误非常危险,实在是值得引起足够的重视……
shrinerain 2005-11-02
  • 打赏
  • 举报
回复
楼主需要补习一下基础了
Ivony 2005-11-02
  • 打赏
  • 举报
回复
在我的印象中,C++在相同的精度下计算,似乎不会出现这种问题。

100%记错


在C++中,浮点数极容易出现误差。C#还会智能优化一下避免一些误差。


只要是浮点数就会有精度损失,这是编程的常识问题,精确计算使用整型。浮点数永远是近似表达。

如果是精确计算,是必须使用整型的,近似计算才允许使用浮点数。



为什么浮点运算在图像处理方面很重要就是因为在图像处理方面的近似计算非常多。
ghui 2005-11-02
  • 打赏
  • 举报
回复
re jxufewbt(我的目标是5星) :
什么意思? a, b, c, d, f, x 同为double类型,相同精度的数据之间的计算,只要不超出精度范围,应该不会出现精度误差才对!

re zhy0101(香蕉) :
我希望在小数点后24位的范围内,不要出现精度误差!现在居然在2位的时候就已经出现了误差,让我感觉浮点类型计算不能获取到期望的值,不知道如何处理才能够避免这种情况的发生!
jxufewbt 2005-10-29
  • 打赏
  • 举报
回复
因为x是double型的啊
zhy0101 2005-10-29
  • 打赏
  • 举报
回复
如果真算到24位,不会有误差。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧