让人困惑的浮点精度和误差
資深大佬 : sillydaddy 6
计算机的浮点数只有有限精度,浮点运算会损失精度,我就遇到了一个例子:
已知 A,B 两点坐标分别为(10000000.0, 0, 0), (10000000.0, 0.001, 0),求 AB 线段的长度。
解法 1: 直接求向量 A-B=(0,0.001,0)的长度,得到结果是 0.001
解法 2: 由于 A 、B 和原点 O 构成直角三角形,使用勾股定理,使用|AO|*|AO| – |BO|*|BO| = |AB|*|AB|,求得|AB|是 0
其中,解法 2 由于在大数的乘法运算后,再做减法运算,导致损失了精度。
已知 A,B 两点坐标分别为(10000000.0, 0, 0), (10000000.0, 0.001, 0),求 AB 线段的长度。
解法 1: 直接求向量 A-B=(0,0.001,0)的长度,得到结果是 0.001
解法 2: 由于 A 、B 和原点 O 构成直角三角形,使用勾股定理,使用|AO|*|AO| – |BO|*|BO| = |AB|*|AB|,求得|AB|是 0
其中,解法 2 由于在大数的乘法运算后,再做减法运算,导致损失了精度。
那么,现在我想解二次方程 a*x*x+b*x+c=0 的根:
用求根公式:x1,2=(-b±Δ)/(2*a),其中Δ=sqrt(b*b-4*a*c)
公式里面有浮点数的乘法,加减法,除法,所以比照上面举的例子,这里应该也会损失精度。
那么损失的精度是多少呢?
我注意到,方程系数 a,b,c 的值可以等比例放大,不影响理论上的计算结果,那么可以通过放大 a,b,c 的值,让经过运算后的浮点结果更精确吗?
大佬有話說 (6)