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