感觉 double 精度不够用啊

2023-09-28 14:10:51 +08:00
 tool2d
这几天程序有一个 bug ,查出来是计算一个三角形面积,理论上应该是负数,但是函数算出来是正数,百思不得其解。

后来把计算面积公式里的 double 换成了 doubledouble 类,把精度加倍,结果就正确了。

寻思坐标也不是什么很大的值,怎么 double 就当场挂掉了呢?

=========
测试代码如下:

double buf[6];
buf[0*2+0] = 830776.16442871094; buf[0*2+1] = 430600.56744384766;
buf[1*2+0] = 830776.37707519531; buf[1*2+1] = 430600.68286132813;
buf[2*2+0] = 830776.16430664063; buf[2*2+1] = 430600.56732177734;

int numvertex = 3;

double area = 0.0;
for (int p=numvertex-1,q=0; q<numvertex; p=q++)
{
double a1 = buf[p*2+0] * buf[q*2+1];
double a2 = buf[q*2+0] * buf[p*2+1];
area += a1 - a2;
}

最终 area 结果
如果是 double ,那么值是 0.0000610 (错误)
如果是 doubledouble ,那么值是-0.0000118 (正确)

看起来是计算误差问题,但结果一个正,另一个负,足以把程序逻辑搞得天翻地覆。
3358 次点击
所在节点    程序员
23 条回复
zmxnv123
2023-09-28 16:44:26 +08:00
为什么三角形的面积可以是负数
MeteorCat
2023-09-29 10:15:14 +08:00
用 bigdecimal 相关库绝对没错,其他技巧都是假的
realpg
2023-09-29 20:43:29 +08:00
不是科班出身就容易踩这种坑
能不用 float 就不用 float
必须得用 float ,每次任意运算之前都得先问问自己精度的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/977923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX