fortran程序改错:请问下面两个程序的结果为什么会不一样啊?
programmainreal(kind=8)::a,ba=8.0b=a**(1.0/3.0)write(*,*)bstopend另个:programmainreal(k...
program main
real(kind=8)::a,b
a=8.0
b=a**(1.0/3.0)
write(*,*) b
stop
end
另个:
program main
real(kind=8)::a,b
a=8.0
b=8.0**(1.0/3.0)
write(*,*) b
stop
end 展开
real(kind=8)::a,b
a=8.0
b=a**(1.0/3.0)
write(*,*) b
stop
end
另个:
program main
real(kind=8)::a,b
a=8.0
b=8.0**(1.0/3.0)
write(*,*) b
stop
end 展开
1个回答
展开全部
请楼主注意,不止变量有精度,常量也有精度!!
8.0 1.0 3.0
都是单精度的常量。
单精度与单精度计算,误差一致。
单精度与双精度计算,就存在转换误差。
program main
real(kind=8)::a,b
a=8.0 !// a 是双精度,但 8.0 是单精度
b=a**(1.0/3.0) !// 双精度a与单精度1.0/3.0计算,计算过程中有转换差距。
write(*,*) b
stop
end
另个:
program main
real(kind=8)::a,b
a=8.0 !// a 是双精度,但 8.0 是单精度
b=8.0**(1.0/3.0) !// 单精度8.0与单精度1.0/3.0计算,计算结果的误差是一致的。计算完毕后再转换为双精度,存入 b 中,所以误差较小。
write(*,*) b
stop
end
实际上,对于你的程序,我建议修改如下(常量也用双精度!)
program main
real(kind=8)::a,b
a=8.0D0
b=a**(1.0D0/3.0D0)
write(*,*) b
stop
end
program main
real(kind=8)::a,b
a=8.0D0
b=8.0D0**(1.0D0/3.0D0)
write(*,*) b
stop
end
8.0 1.0 3.0
都是单精度的常量。
单精度与单精度计算,误差一致。
单精度与双精度计算,就存在转换误差。
program main
real(kind=8)::a,b
a=8.0 !// a 是双精度,但 8.0 是单精度
b=a**(1.0/3.0) !// 双精度a与单精度1.0/3.0计算,计算过程中有转换差距。
write(*,*) b
stop
end
另个:
program main
real(kind=8)::a,b
a=8.0 !// a 是双精度,但 8.0 是单精度
b=8.0**(1.0/3.0) !// 单精度8.0与单精度1.0/3.0计算,计算结果的误差是一致的。计算完毕后再转换为双精度,存入 b 中,所以误差较小。
write(*,*) b
stop
end
实际上,对于你的程序,我建议修改如下(常量也用双精度!)
program main
real(kind=8)::a,b
a=8.0D0
b=a**(1.0D0/3.0D0)
write(*,*) b
stop
end
program main
real(kind=8)::a,b
a=8.0D0
b=8.0D0**(1.0D0/3.0D0)
write(*,*) b
stop
end
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询