使用`real(wp)`可以在Fortran中获得更高的准确性吗?

问题描述 投票:0回答:1

一个简单的问题:

通过替换所有内容使代码的准确性更高:

real(dl) variable1

通过在每个Fortran90源文件的开头放置:

integer, parameter :: wp = selected_real_kind(15,307)

并像这样声明变量:

real(wp) variable1

UPDATE 1:是的,一个简单的程序给出了:

program  main

  implicit none

  integer, parameter :: dl = KIND(1.d0)
  integer, parameter :: wp = selected_real_kind(15,307)
  real(kind=dl) :: dl_number
  real(kind=wp) :: wp_number

  write(*,*) 'epsilon for dl number', epsilon(dl_number)
  write(*,*) 'precision for dl number', precision(dl_number)
  write(*,*) 'epsilon for wp number', epsilon(wp_number)
  write(*,*) 'precision for wp number', precision(wp_number)

  stop

结束

和输出:

epsilon for dl number   2.2204460492503131E-016
 precision for dl number          15
 epsilon for wp number   2.2204460492503131E-016
 precision for wp number          15

因此,无需使用wp = selected_real_kind(15,307)代替dl = KIND(1.d0)

谢谢

fortran precision fortran90
1个回答
2
投票

一般编号

有两个问题:

  1. wp是dl吗?这取决于编译器和平台。

  2. 浮点数精度的提高会改善数值结果吗?在某些情况下,准确性受算法或数据的限制,除了较慢的程序外,您从中什么也得不到。

无论如何,作为第一个诊断,执行>

write(*,*) 'dl =', dl
write(*,*) 'wp =', wp

查看种类实际上是否相同。

然后,您可以获得有关种类的一些信息:

real(kind=dl) :: dl_number
real(kind=wp) :: wp_number

write(*,*) 'epsilon for dl number', epsilon(dl_number)
write(*,*) 'precision for dl number', precision(dl_number)
write(*,*) 'epsilon for wp number', epsilon(wp_number)
write(*,*) 'precision for wp number', precision(wp_number)

[epsilon返回该类型的最小可表示数字,precision返回十进制精度。

无论如何,您应该对计算和工作所需要的精度有所了解。

正如albert和Ian Bush指出的那样,代码中还有许多其他地方需要检查数字表示问题。

  • 文学常数需要特别注意。例如,1.0/3.01._wp/3._wp具有明显不同的值。
  • 除非有要求,某些函数还将返回默认的实数值(即单精度),例如real固有值。
  • ...
© www.soinside.com 2019 - 2024. All rights reserved.