Fortran - ความแม่นยำของตัวเลข

เราได้พูดคุยกันแล้วว่าใน Fortran เวอร์ชันเก่ามีสองอย่าง real ประเภท: ประเภทจริงเริ่มต้นและ double precision ชนิด.

อย่างไรก็ตาม Fortran 90/95 ให้การควบคุมความแม่นยำของชนิดข้อมูลจริงและจำนวนเต็มมากขึ้นผ่านไฟล์ kind specifie.

แอตทริบิวต์ชนิด

หมายเลขประเภทต่างๆจะถูกจัดเก็บแตกต่างกันในคอมพิวเตอร์ 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

การสอบถามขนาดของตัวแปร

มีฟังก์ชันภายในจำนวนมากที่ช่วยให้คุณสามารถซักถามขนาดของตัวเลขได้

ตัวอย่างเช่นไฟล์ bit_size(i)ฟังก์ชันภายในระบุจำนวนบิตที่ใช้สำหรับการจัดเก็บ สำหรับจำนวนจริงprecision(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

การได้รับมูลค่าชนิด

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