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