一个简单的问题。有一个类似的问题,但我找不到我想要的那个。
我只是检查了fortran 90中的实际数据类型的限制(使用ifort编译器),原因是我的实际代码可能达到了这个限制。为了测试,我简单地给出了一个参数 mval1 (参见代码)并乘以2.在ifort手册中,它表示它可以采用的最大值是10E38,而且我的值远小于此值。但是在打印时,它会随机抽取数字(输出在底部给出)。任何人都可以帮助我完成这个
PROGRAM TEST
IMPLICIT NONE
REAL(KIND=8), PARAMETER :: mval1 = 1073E12
REAL(KIND=8) :: j
j = real(2*mval1)
PRINT *, j,mval1
END PROGRAM TEST
输出
2.146000005234688E+015 1.073000002617344E+015
答案 0 :(得分:3)
要添加到您已经拥有的评论中的两点。
一:在英特尔Fortran real(kind=8)
变量与IEEE-754双精度数相同,最大正值为1.797693134862316E+308
。对于单精度IEEE浮点数,英特尔Fortran real(kind=4)
,最大值为3.4028235E+38
,大约为10E38
。
二:您的声明
REAL(KIND=8), PARAMETER :: mval1 = 1073E12
为mval1
指定默认真实种类的值。我不知道您的默认编译器设置是什么,但检查如果将该行更改为
REAL(KIND=8), PARAMETER :: mval1 = 1073E12_8
明确声明文字是kind=8
。
你不太明白的问题的答案,以及其他评论中你没有给出的答案是:浮点运算是棘手的,使用它的程序员应该至少熟悉基本技巧。 Wikipedia article on floating-point数字和算术是您自我教育的良好起点。无论其他人告诉你什么都忽略了Goldberg的论文每个计算机科学家应该知道浮点运算,直到你开始尝试实现自己的浮点数和算术。