Fortran数字格式

时间:2012-01-31 16:44:59

标签: loops double fortran rounding

我正在使用英特尔®VisualFortran编译器专业版11.1以及运行此代码时

program Console1
implicit none

real(8), parameter:: iterations = 1000.d0
real(8), parameter:: maximum = 0.02d0

integer, parameter:: outfile=1

real(8) force, dforce
integer i

dforce = maximum/iterations
force = 0.d0

open (unit=outfile,file="results.txt",action="write",status="replace")
do i=0,int(iterations)
    write(outfile, *) force
    force = force+dforce
enddo
close(outfile)

endprogram

文件results.txt是一团糟,最终的数字是1.999999999999952E-002而不是2.d-2

我做错了什么? 谢谢!

3 个答案:

答案 0 :(得分:9)

不再!浮点数不是实数的精确表示。期。

What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:4)

你和富兰都没有做错任何事。你正面临着计算算术运算的基本限制。

计算机以二进制的方式存储精度有限的数字“force”,而不是精确的分数或小数。从不使用确切的值 - 只达到一定的准确度。

kemiisto发布的链接更详细地解释了,但从中获取的主要内容是口号:“真实(浮点)数字永远不会精确”。这意味着每当你需要比较两个实数时,除非它们有一些非常具体的值,如零,那么你需要检查它们是否接近,不相同。

您可以使用格式说明符修改最后打印数字的方式: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html

答案 2 :(得分:2)

回答这个问题:

声明

write(outfile, *) force

使用Fortran调用的“列表导向I / O”。 '*'将它留给编译器,以便为变量'force'的输出找出合理的格式。如果要控制输出的格式,请使用Fortran的编辑描述符。例如

write(outfile, '(f6.3)') force

将根据描述符'f6.3'格式化数字 - 这不是提问者想要的,但我希望它能让她走上正轨。