Fortran:数值精度

声明:本博文翻译自:https://www.tutorialspoint.com/fortran/fortran_numeric_precision.htm

使用fortran语言的大多是非计算机专业的学生,所以有很多人在用fortran语言编写程序时,往往忽略了数值精度这一块知识内容。

我们已经讨论过,在早期版本的Fortran中,有两种实类型:默认实类型和双精度类型。
然而,Fortran 90/95通过kind对实际和整数数据类型的精度提供了更多的控制。

1. the kind attribute
不同种类的数字存储在不同的计算机中。kind属性允许指定如何在内部存储数字
例如:
real, kind = 2 :: a, b, c
real, kind = 4 :: e, f, g
integer, kind = 2 :: i, j, k
integer, kind = 3 :: l, m, n
在上面的声明语句中,实型变量e,f,g比a,b,c有更高的精度。整型变量l,m,n比i,j,k可以存储更大的数值
示例代码:
Program kindSpecifier
  implicit none

  real(kind = 4) :: a, b, c
  real(kind = 8) :: e, f, g
  integer(kind = 2) :: i, j, k
  integer(kind = 4) :: l, m, n
  integer :: kind_a, kind_i, kind_e, kind_l

  kind_a = kind(a)
  kind_i = kind(i)
  kind_e = kind(e)
  kind_l = kind(l)

  print *,'default kind for real is', kind_a
  print *,'default kind for int is', kind_i
  print *,'extended kind for real is', kind_e
  print *,'default kind for int is', kind_l

End program kindSpecifier
执行结果如下:
default kind for real is 4
default kind for int is 2
extended kind for real is 8
default kind for int is 4

2. Inquiring the Size of Variables
有许多内在函数允许查询数字的大小。
例如,内置函数bit_size(i)指定用于存储的比特数
内置函数precision(x)返回数字x的精度
range(x)返回十进制数的指数范围
示例代码如下:
Program getSize
  implicit none

  real (kind = 4) :: a
  real (kind = 8) :: b
  integer (kind = 2) :: i
  integer (kind = 4) :: j

  print *,'precision of real(4) =', precision(a)
  print *,'precision of real(8) =', precision(b)

  print *,'range of real(4) =', range(a)
  print *,'range of real(8) =', range(b)


  print *,'maximum exponent of real(4) =' , maxexponent(a)
  print *,'maximum exponent of real(8) =' , maxexponent(b)

  print *,'minimum exponent of real(4) =' , minexponent(a)
  print *,'minimum exponent of real(8) =' , minexponent(b)

  print *,'bits in integer(2) =' , bit_size(i)
  print *,'bits in integer(4) =' , bit_size(j)

End program getSize
执行结果如下:
precision of real(4) = 6
precision of real(8) = 15
range of real(4) = 37
range of real(8) = 307
maximum exponent of real(4) = 128
maximum exponent of real(8) = 1024
minimum exponent of real(4) = -125
minimum exponent of real(8) = -1021
bits in integer(2) = 16
bits in integer(4) = 32

3. Obtaining the Kind Value
Fortran提供了另外两个内在函数,以获得所需整数和实数精度的类值.
(1) selected_int_kind(r)
(2) selected_real_kind([p,r])
selected_real_kind函数返回一个整数,该整数是给定的十进制精度p和十进制指数范围r所需的类型参数值.p:是精度的缩写;r是范围的缩写。十进制精度是有效数字的个数,十进制指数范围指定最小和最大的可表示数字。The range is thus from 10-r to 10+r.
例如,selected_real_kind (p = 10, r = 99)返回精度为10位小数、范围至少为10-9910+99所需的kind值。
示例代码如下:
program getKind
  implicit none

  integer:: i
  i = selected_real_kind (p = 10, r = 99) 
  print *,'selected_real_kind (p = 10, r = 99):', i

End program getKind
运行结果如下:
selected_real_kind (p = 10, r = 99): 8
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值