Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
系统中精度最高的Fortran fomat语句_Fortran_Fortran90_Gfortran_Fortran77 - Fatal编程技术网

系统中精度最高的Fortran fomat语句

系统中精度最高的Fortran fomat语句,fortran,fortran90,gfortran,fortran77,Fortran,Fortran90,Gfortran,Fortran77,如果有人不想那么精确,他会写 999 format ('The answer is x = ', F8.3) 其他想要更高输出精度的人可能会写 999 format ('The answer is x = ', F18.12) 因此,这完全取决于用户的需求。格式是什么 与计算中使用的精度完全匹配的语句? (注意,这可能因系统而异)这是一个困难的问题,因为您要求“计算精度”,这取决于许多因素。例如:如果我通过牛顿法将f(x)=0解为1E-6的公差,您是否需要七位数的格式 另一方面,如果您

如果有人不想那么精确,他会写

999    format ('The answer is x = ', F8.3)
其他想要更高输出精度的人可能会写

999 format ('The answer is x = ', F18.12)
因此,这完全取决于用户的需求。格式是什么 与计算中使用的精度完全匹配的语句?
(注意,这可能因系统而异)

这是一个困难的问题,因为您要求“计算精度”,这取决于许多因素。例如:如果我通过牛顿法将f(x)=0解为1E-6的公差,您是否需要七位数的格式

另一方面,如果您指的是“类型可达到的最高精度”(例如,双精度或单精度),那么您可以简单地找到相应的epsilon(机器eps,或精度),并将其用作格式标志。如果epsilon为1E-15,则可以使用不超过16位的格式标志

在Fortran中,您可以使用EPSILON(X)函数来获得这个数字(答案将取决于X的类型),您可以计算EPSILON的对数(以10为底)的绝对值,并使其成为浮点表示中的小数数


例如,如果epsilon是1E-12,log是-12,abs是12,floor是12,那么您需要像15.12F这样的格式(12位小数+1位零+符号=15位)

浮点数的问题是没有精度:只有有效数字

例如,如果你在英国附近用real*1计算经度,你将精确到小数点后6位,但如果你在科罗拉多州斯普林斯,它将只精确到小数点后4位。用F格式打印数字是没有任何意义的,因为在小数点后第四位是垃圾

如果希望以最大精度打印,请以E格式打印。因为它总是n.nn..nEnn,所以得到所有有效数字

编辑-用户4050的查询 试试下面的例子

program main
   real intpart, multiplier
   integer ii

   multiplier = 1
   do ii = 1, 6
      intpart = 9.87654321
      intpart = intpart * multiplier
      print '(F15.7 E15.7 G15.8)', intpart, intpart, intpart
      multiplier = multiplier * 10
   end do
   stop
end program
你会得到类似的东西

      9.8765430  0.9876543E+01  9.8765430
     98.7654266  0.9876543E+02  98.765427
    987.6542969  0.9876543E+03  987.65430
   9876.5429688  0.9876543E+04  9876.5430 
  98765.4296875  0.9876543E+05  98765.430
 987654.3125000  0.9876543E+06  987654.31

请注意,精度会随着数字变大而变化,因为浮点只有7位有效数字。

要自动执行此操作,您可以将从
EPSILON()
中获得的数字写入一个字符,然后将其连接到format语句中。@Arrieta,您已经完成了一半。。一旦确定了所需的精度,您还需要考虑数字的大小,以获得所需的小数位数。重新设计列表导向格式需要做很多工作。@George:我同意你的看法。。。我其实不喜欢我的答案;(我提出了一个折衷方案。但我没有更多的想法;(列出定向IO,
write(*,*)
,应自动提供列表中类型的精度。但您放弃了对输出布局的控制。是否有保证可以通过精确恢复值来读回值?毫无疑问,这与编译器有关,但列表定向写入的精度比读取bac值所需的精度稍低k in不丢失(看起来*为1阶的单精度值提供了f15.6,其中需要f15.7。)@Jagte FYI将字符串填充到statent格式是老生常谈。我希望您不认为这是必需的。写(*,*)‘答案是,’x很可能就是你所需要的,除非你真的想保持一位数的精度,或者你真的需要精确控制间距。你怎么确定计算中使用了什么精度?当这个答案是可以理解的时候,它是错的。一个很好的数字精度定义由计算机存储或操作的有效位数是指存储或操作的有效位数。Fortran的
e
编辑描述符可用于编写
real
的无、少、多或所有有效位数。至于关于英国与科罗拉多经度相对准确度的评论,我想你已经陷入了思考以度为单位——改为弧度。当大多数使用Fortran的人说精度时,他们指的是小数位数。关键是要使用E格式而不是F格式来获得有效数字。如果使用F格式,你可能会得到所有有效数字,不足的数字,或者你可能会得到绝对的垃圾。经度只是每个人都知道的一个例子理解:它可以是范围很广的任何内容。@cup我对您的答案感兴趣,但我不知道它与使用F格式有什么不同,您仍然需要指定要以E格式打印的位数,不是吗?