Loops Fortran数字格式

Loops Fortran数字格式,loops,double,fortran,rounding,Loops,Double,Fortran,Rounding,我正在使用英特尔Visual Fortran编译器专业版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 forc

我正在使用英特尔Visual Fortran编译器专业版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.99999999952E-002,而不是2.d-2

我做错了什么?
谢谢

别再这样了!浮点数不是实数的精确表示。句号


.

您和fortran都没有做错任何事。你会遇到一个基本的极限,即算术是如何计算的

计算机以有限的精度以二进制形式存储数字,而不是以精确的分数或十进制形式存储。绝对不会使用精确值-只会达到一定程度的精度

kemiisto发布的链接更详细地解释了这一点,但其中最重要的一点是:真正的浮点数永远不会精确。这意味着,每当你需要比较两个实数时,除非它们有一些非常具体的值,比如零,否则你需要检查它们是否接近,而不是完全相同

您可以使用格式说明符修改最后打印数字的方式:
要回答这个问题:

声明

write(outfile, *) force
使用Fortran所称的“列表定向I/O”。“*”让编译器为变量“force”的输出找出合理的格式。如果要控制输出的格式,请使用Fortran的编辑描述符。比如说

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

将根据描述符“f6.3”设置数字格式,这不是发问者想要的,但我希望这将使她走上正确的轨道。

1.99999999952E-002是2.d-2。了解二进制浮点。我更改了你的标题,因为Fortran有什么问题?因为这可能会有点煽动性,而且不够具体,无法吸引能回答你问题的人。@保罗:最好说的是你的机器上实数0.02的浮点表示法。如果你在这个网站上搜索浮点错误,在每种类型的计算机上,你会发现有一百万人在每种语言中都有相同的问题。好吧,问题是二进制除法不精确,对吗?迭代次数=1000.d0,最大值=1.d0,最后一个数字是2.d0,浮点数的运算是精确的-包括加法、减法,你可以说。在一些特殊情况下,事物可以用二进制或偶然的方式完美地表示,有时事物可以完美地取整,但你永远不应该依赖于这一点。问题的根源在于,并非每个实数都可以用浮点格式精确地表示,而不考虑基数。就我记忆中的基数x而言,你可以精确地表示形式为[有效数字*x^指数]的数字。是的,我的意思不是说这是二进制的问题,而是说它是浮点。我认为OP需要意识到他们对此无能为力!从问题中不清楚提问者到底想要什么,如果这是一个格式化问题还是一个非格式化问题,我只是读了“Fortran数字格式化”,并认为主题是Fortran数字格式化。但英语不是我的第一语言,所以我可能错过了一些微妙的措辞。