主题:精度!精度!
llbbhq
[专家分:0] 发布于 2011-04-28 18:21:00
原贴“各位帮忙看看我的问题”中,那个算法我是证明过的,用其它语言也算过,肯定是能退出的,但不知为什么在FORTRAN中就是不行。我能找到的问题就只有精度问题了,举个例子:
已知:1.52368*2.0=3.047360
但是,我在FORTRAN中试验了一下,如果令:
REAL(KIND=8)::A=1.52368,然后:
WRITE(*,"(F10.8)") A*2.0
结果并不等于3.04736000
这个微小的精度差异或许在不停的循环迭代中会对最后的结果有重大影响。
我不知道自己这个猜想对不对,想证明一下,但是不知道该如何去写代码。在上面的例子中就是,如何能让他输出准确的结果
回复列表 (共15个回复)
沙发
dongyuanxun [专家分:7180] 发布于 2011-04-28 19:32:00
A=1.52368d0
A*2.0d0
板凳
yeg001 [专家分:14390] 发布于 2011-04-28 23:04:00
关于常数声明精度的问题参考楼上, 与之相关的讨论可以翻翻旧帖.
3 楼
llbbhq [专家分:0] 发布于 2011-04-29 10:13:00
变量若想保持精度,该怎么声明?
比如real::c(8)
c=matmul(a,b)
怎么样让c的计算结果保持精度?
4 楼
yeg001 [专家分:14390] 发布于 2011-04-29 10:30:00
计算过程中没有混合精度, 最终结果还是跟声明精度一致. 没什么保持不保持的.
5 楼
llbbhq [专家分:0] 发布于 2011-04-29 10:38:00
我意思是我想得到一个正确的计算结果,若是不声明结果会不会不太准确?
6 楼
yeg001 [专家分:14390] 发布于 2011-04-29 10:40:00
跟其它语言一样, 不需要声明结果.
7 楼
llbbhq [专家分:0] 发布于 2011-04-29 10:52:00
比如之前“WRITE(*,"(F10.8)") A*2.0”,如果没声明输出结果并不正确。
这是计算就出错了还是其实算对了,只是输出错了而已?
8 楼
dongyuanxun [专家分:7180] 发布于 2011-04-29 11:11:00
[quote]比如之前“WRITE(*,"(F10.8)") A*2.0”,如果没声明输出结果并不正确。
这是计算就出错了还是其实算对了,只是输出错了而已?
[/quote]
real(8) :: A
A=1.52368d0
WRITE(*,"(F10.8)") A*2.0d0
9 楼
yeg001 [专家分:14390] 发布于 2011-04-29 12:36:00
正如xun哥写的, 是你的常数1.52368默认是单精度, 导致赋值给A之后精度不够.
不信你可以write这个a出来看看还是不是1.52368.
关于这个问题我前面也说了, 可以翻翻旧帖, 看看讨论.
10 楼
llbbhq [专家分:0] 发布于 2011-04-29 21:11:00
我懂你们的意思了,你们没懂我的意思。我的意思是比如果是矩阵相乘,MATMUL(A,B) 计算的结果会不会不准确。不是常数的赋值精度问题
我来回复