Fortran - Ədədi dəqiqlik

Fortranda Sayılar

Artıq qeyd etdiyimiz kimi, Fortran-ın köhnə versiyalarında iki real növ mövcud idi: standart real növ və ikiqat dəqiqlik növü.

Ancaq Fortran 90/95 real və tam ədəd məlumat növlərinin dəqiqliyini kind atributu vasitəsilə daha yaxşı idarə etməyə imkan verir.

Kind Atributu

Fərqli növ nömrələr kompüterdə fərqli şəkildə saxlanılır. Kind atributu, bir ədədin daxili necə saxlandığını göstərməyə imkan verir. Məsələn:

real, kind = 2 :: a, b, c
real, kind = 4 :: e, f, g
integer, kind = 2 :: i, j, k
integer, kind = 3 :: l, m, n

Yuxarıdakı bəyanatda, e, f, və g real dəyişənləri, a, b, və c real dəyişənlərindən daha çox dəqiqliyə sahibdir. l, m, və n tam ədədləri i, j, və k tam ədədlərinə nisbətən daha böyük dəyərləri saxlaya bilər və saxlama üçün daha çox rəqəm tələb edir. Bu isə maşından asılıdır.

Nümunə

Canlı Demo

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

Yuxarıdakı proqramı tərtib edib icra etdikdə, aşağıdakı nəticəni alırıq −

default kind for real is 4
default kind for int is 2
extended kind for real is 8
default kind for int is 4

Dəyişənlərin Ölçüsünü Sorğulamaq

Bir sıra daxili funksiyalar, ədədlərin ölçüsünü sorğulamağa imkan verir.

Məsələn, bit_size(i) daxili funksiyası, saxlama üçün istifadə olunan bit sayı göstərir. Real ədədlər üçün, precision(x) daxili funksiyası, ondalıklı nöqtə dəqiqliyinin sayını qaytarır, range(x) daxili funksiyası isə, eksponentin ondalıklı diapazonunu qaytarır.

Nümunə

Canlı Demo
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

Yuxarıdakı proqramı tərtib edib icra etdikdə, aşağıdakı nəticəni alırıq −

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

Karyeranızı inkişaf etdirmək üçün ən son onlayn kurslarımıza göz atın və öz sürətinizlə yeni bacarıqlar öyrənin. Qeydiyyatdan keçin və sertifikatlı mütəxəssis olun.

Kind Dəyərinin Alınması

Fortran, tələb olunan tam ədəd və real növlərin dəqiqliyi üçün kind dəyərini əldə etmək üçün daha iki daxili funksiya təqdim edir:

  • selected_int_kind (r)
  • selected_real_kind ([p, r])

selected_real_kind funksiyası, verilən ondalıklı dəqiqlik p və ondalıklı eksponent diapazonu r üçün tələb olunan kind növü parametr dəyərini qaytarır. Ondalıklı dəqiqlik, əhəmiyyətli rəqəmlərin sayıdır və ondalıklı eksponent diapazonu isə ən kiçik və ən böyük təmsil edilə bilən ədədi göstərir. Diapazon, 10-r-dən 10+r-ə qədərdir.

Məsələn, selected_real_kind (p = 10, r = 99) funksiyası, 10 ondalıklı rəqəm və ən az 10-99 ilə 10+99 arasında bir diapazon üçün tələb olunan kind dəyərini qaytarır.

Nümunə

Canlı Demo
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

Yuxarıdakı proqramı tərtib edib icra etdikdə, aşağıdakı nəticəni alırıq −

selected_real_kind (p = 10, r = 99) 8