我正在使用英特尔®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
我做错了什么? 谢谢!
答案 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'格式化数字 - 这不是提问者想要的,但我希望它能让她走上正轨。