作者perceval (摸鱼中)
看板Fortran
标题Re: [问题] 计算的精准度问题
时间Fri Aug 7 03:24:01 2009
※ 引述《jyhchyunlu (jyhchyunlu)》之铭言:
: 各位板友好
: 我碰上了一个很奇怪的问题
: 是这样的
: 有三个变数 AL ALO E0 格式都是DOUBLE
: ALO=1.000000000000000
: AL 0.999999600000000
: E0=(AL-ALO)/ALO
: 答案应该是-4.000000000000000E-007
: 但我跑出来的结果却是 E0 =-4.000000000115023E-007
: 请问是哪边出错了呢
这是浮点运算的问题
可以查一下round off error或是数值分析课本第一章
粗略的说, 双精度下(十进位)的有效位数是16位
所以在电脑里
1234567890123456
ALO= 1.000000000000000
AL = 0.9999996000000000
AL-ALO=-0.000000400000000
有效位数大约只剩9位
(实际计算时是以二进位计算所以只能说大约)
剩下的那些位数基本上是不可信的
如果这样程度的误差会对你的计算有很大的影响的话
你可能要思考看看有没有办法避免让两个接近的数相减
--
The whole problem with the world is that fools and fanatics are
always so certain of themselves, but wiser people so full of doubts.
– Bertrand Russell
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.66.0.97
1F:推 wenni:可以查查Subtractive Cancellation Error 减性抵消误差 08/07 12:16