Fortran - ตัวเลข

ตัวเลขใน Fortran แสดงด้วยข้อมูลภายในสามประเภท -

  • ประเภทจำนวนเต็ม
  • ประเภทจริง
  • ประเภทที่ซับซ้อน

ประเภทจำนวนเต็ม

ชนิดจำนวนเต็มสามารถเก็บได้เฉพาะค่าจำนวนเต็ม ตัวอย่างต่อไปนี้จะแยกค่าที่ใหญ่ที่สุดที่สามารถถือเป็นจำนวนเต็มสี่ไบต์ตามปกติ -

program testingInt
implicit none

   integer :: largeval
   print *, huge(largeval)
   
end program testingInt

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

2147483647

โปรดทราบว่าไฟล์ huge()ฟังก์ชันให้จำนวนมากที่สุดที่สามารถถือได้โดยชนิดข้อมูลจำนวนเต็มเฉพาะ คุณยังสามารถระบุจำนวนไบต์โดยใช้kindตัวระบุ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ -

program testingInt
implicit none

   !two byte integer
   integer(kind = 2) :: shortval
   
   !four byte integer
   integer(kind = 4) :: longval
   
   !eight byte integer
   integer(kind = 8) :: verylongval
   
   !sixteen byte integer
   integer(kind = 16) :: veryverylongval
   
   !default integer 
   integer :: defval
        
   print *, huge(shortval)
   print *, huge(longval)
   print *, huge(verylongval)
   print *, huge(veryverylongval)
   print *, huge(defval)
   
end program testingInt

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647

ประเภทจริง

จะเก็บตัวเลขทศนิยมเช่น 2.0, 3.1415, -100.876 เป็นต้น

ตามเนื้อผ้ามีสองอย่างที่แตกต่างกัน real ประเภท: ประเภทจริงเริ่มต้นและ double precision ชนิด.

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

ตัวอย่างต่อไปนี้แสดงการใช้ประเภทข้อมูลจริง -

program division   
implicit none

   ! Define real variables   
   real :: p, q, realRes 
   
   ! Define integer variables  
   integer :: i, j, intRes  
   
   ! Assigning  values   
   p = 2.0 
   q = 3.0    
   i = 2 
   j = 3  
   
   ! floating point division
   realRes = p/q  
   intRes = i/j
   
   print *, realRes
   print *, intRes
   
end program division

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

0.666666687    
0

ประเภทที่ซับซ้อน

ใช้สำหรับจัดเก็บจำนวนเชิงซ้อน จำนวนเชิงซ้อนมี 2 ส่วนคือส่วนจริงและส่วนจินตภาพ หน่วยเก็บข้อมูลตัวเลขสองหน่วยต่อเนื่องกันจะจัดเก็บสองส่วนนี้

ตัวอย่างเช่นจำนวนเชิงซ้อน (3.0, -5.0) เท่ากับ 3.0 - 5.0i

ฟังก์ชันทั่วไป cmplx()สร้างจำนวนเชิงซ้อน มันสร้างผลลัพธ์ว่าใครเป็นส่วนจริงและส่วนจินตภาพเป็นความแม่นยำเดียวโดยไม่คำนึงถึงประเภทของอาร์กิวเมนต์อินพุต

program createComplex
implicit none

   integer :: i = 10
   real :: x = 5.17
   print *, cmplx(i, x)
   
end program createComplex

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

(10.0000000, 5.17000008)

โปรแกรมต่อไปนี้แสดงให้เห็นถึงการคำนวณจำนวนเชิงซ้อน -

program ComplexArithmatic
implicit none

   complex, parameter :: i = (0, 1)   ! sqrt(-1)   
   complex :: x, y, z 
   
   x = (7, 8); 
   y = (5, -7)   
   write(*,*) i * x * y
   
   z = x + y
   print *, "z = x + y = ", z
   
   z = x - y
   print *, "z = x - y = ", z 
   
   z = x * y
   print *, "z = x * y = ", z 
   
   z = x / y
   print *, "z = x / y = ", z 
   
end program ComplexArithmatic

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

(9.00000000, 91.0000000)
z = x + y = (12.0000000, 1.00000000)
z = x - y = (2.00000000, 15.0000000)
z = x * y = (91.0000000, -9.00000000)
z = x / y = (-0.283783793, 1.20270276)

ช่วงความแม่นยำและขนาดของตัวเลข

ช่วงของตัวเลขจำนวนเต็มความแม่นยำและขนาดของตัวเลขทศนิยมขึ้นอยู่กับจำนวนบิตที่จัดสรรให้กับชนิดข้อมูลที่ระบุ

ตารางต่อไปนี้แสดงจำนวนบิตและช่วงสำหรับจำนวนเต็ม -

จำนวนบิต ค่าสูงสุด เหตุผล
64 9,223,372,036,854,774,807 (2 ** 63) –1
32 2,147,483,647 (2 ** 31) –1

ตารางต่อไปนี้แสดงจำนวนบิตค่าที่น้อยที่สุดและมากที่สุดและความแม่นยำของจำนวนจริง

จำนวนบิต มูลค่าที่ใหญ่ที่สุด ค่าน้อยที่สุด ความแม่นยำ
64 0.8E + 308 0.5E – 308 15–18
32 1.7E + 38 0.3E – 38 6-9

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ -

program rangePrecision
implicit none

   real:: x, y, z
   x = 1.5e+40
   y = 3.73e+40
   z = x * y 
   print *, z
   
end program rangePrecision

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

x = 1.5e+40
          1
Error : Real constant overflows its kind at (1)
main.f95:5.12:

y = 3.73e+40
           1
Error : Real constant overflows its kind at (1)

ตอนนี้ให้เราใช้ตัวเลขที่น้อยลง -

program rangePrecision
implicit none

   real:: x, y, z
   x = 1.5e+20
   y = 3.73e+20
   z = x * y 
   print *, z
   
   z = x/y
   print *, z
   
end program rangePrecision

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

Infinity
0.402144760

ตอนนี้มาดู underflow -

program rangePrecision
implicit none

   real:: x, y, z
   x = 1.5e-30
   y = 3.73e-60
   z = x * y 
   print *, z
   
   z = x/y
   print *, z

end program rangePrecision

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

y = 3.73e-60
           1
Warning : Real constant underflows its kind at (1)

Executing the program....
$demo 

0.00000000E+00
Infinity

ตัวระบุชนิด

ในการเขียนโปรแกรมทางวิทยาศาสตร์มักจะต้องทราบช่วงและความแม่นยำของข้อมูลของแพลตฟอร์มฮาร์ดแวร์ที่กำลังทำงานอยู่

ฟังก์ชันที่แท้จริง kind() ช่วยให้คุณสามารถสอบถามรายละเอียดของการแสดงข้อมูลของฮาร์ดแวร์ก่อนที่จะรันโปรแกรม

program kindCheck
implicit none
   
   integer :: i 
   real :: r 
   complex :: cp 
   print *,' Integer ', kind(i) 
   print *,' Real ', kind(r) 
   print *,' Complex ', kind(cp) 
   
end program kindCheck

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

Integer 4
Real 4
Complex 4

คุณยังสามารถตรวจสอบประเภทข้อมูลทั้งหมดได้ -

program checkKind
implicit none

   integer :: i 
   real :: r 
   character :: c 
   logical :: lg 
   complex :: cp 
   
   print *,' Integer ', kind(i) 
   print *,' Real ', kind(r) 
   print *,' Complex ', kind(cp)
   print *,' Character ', kind(c) 
   print *,' Logical ', kind(lg)
   
end program checkKind

เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

Integer 4
Real 4
Complex 4
Character 1
Logical 4