24小时热门版块排行榜    

查看: 550  |  回复: 3

jiangxia0909

木虫 (小有名气)

[求助] 如何有效地避免double型数据相加时产生的误差

遇到问题:如一维的double数组  A[6]={-100.5, -50.9,  3.89,   -4.58,  10.999,  200.8};

这里只是一个例子,实际运算时,数组中数值之间的差距会更大。如果按数组下标依次累加,则可能产生计算误差。

想请教的问题是:如何实现double数组的累加,可降低或者避免此类计算误差 。

目前只知道避免大数加小数,但对于任意的double数组的累加是否有更有效地算法。希望小木虫里的大神指点指点。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijf517

木虫 (小有名气)

这要看你的具体的应用场景。这种数值误差是不可避免的。写代码时数组声明为double型的,这样最终基本可保证累加后小数点后十位左右有效数字,这已经足够了。从物理角度来说,被累加的是同一物理量,量级上不会差太多。比如说你不会计算一只大象和单个电子的质量之和。如果真有量级差别比较大的两个数相加,小数被忽略物理上也是合理的。所以,结论就是,你根本不用考虑这个问题。双精度数组的普通顺序加法就足够了。如果你还是不放心,加之前先把数组的元素按绝对值大小从小到大排个序,然后依次相加,这样理论上可以最大程度避免大小数相加带来的数值误差。我测试比对过,这样的结果和原始数组直接相加结果差距很小,费时且没有必要。事实上,如果你写并行代码的话,经常出现同一数组分布式存储在多个核上,这时数组求和的顺序是随机的,你不大可能从算法层面来避免这种大小数求和。我看过的即便是一些大牛写的非常有名的程序,也不会考虑这种大小数求和带来的数值误差。费时且没意义

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

2楼2017-08-10 22:17:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jiangxia0909

木虫 (小有名气)

送红花一朵
引用回帖:
2楼: Originally posted by lijf517 at 2017-08-10 22:17:06
这要看你的具体的应用场景。这种数值误差是不可避免的。写代码时数组声明为double型的,这样最终基本可保证累加后小数点后十位左右有效数字,这已经足够了。从物理角度来说,被累加的是同一物理量,量级上不会差太多 ...

非常感谢,你的回答对我很有帮助。你可以回复一个应助贴,我好给你金币

发自小木虫Android客户端
3楼2017-08-11 23:04:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

syan21

新虫 (小有名气)

双精度不够,就用双双精度呗

发自小木虫Android客户端
4楼2017-10-22 13:17:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 jiangxia0909 的主题更新
信息提示
请填处理意见