codecamp

Fortran的数字精度

我们已经讨论了,在旧版本的Fortran,有两个真正的类型:默认的实型和双精度型。

然而,Fortran语言90/95提供了真实和整数数据类型通过一种 specifie精确的控制。

那种属性

不同类型的数字是计算机内部存储方式不同。 那种属性允许您指定一个数字在内部存储。例如,

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

查询变量的大小

有许多内在的功能,使您可以询问数字的大小。

例如,BIT_SIZE(ⅰ)内部函数指定用于存储的位数。对于实数, 精度(x)的内部函数,返回的精度小数位数,而范围(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

获取种类值

Fortran语言提供了两个内部函数来获得一种价值整数和实数的精度要求:

  • selected_int_kind(r)的
  • selected_real_kind([P,R])

该selected_real_kind函数返回一个整数,是必要的一个给定的小数精度p和小数指数范围r的那种类型的参数值。小数精度是显著的位数,而小数指数范围规定了最小和最大可表示数。因此,该范围是从10-R 10 + R。

例如,selected_real_kind(P = 10,R = 99)返回需要10精确到小数点的那种价值,射程至少10-99到10 + 99。

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

Fortran内函数
Fortran程序库
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }