با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، در این پست از آموزش های دوره فرترن، اعداد در فرترن را آموزش خواهیم داد. به طور کلی عداد در Fortran در سه نوع داده ارائه شده اند :نوع صحیح، نوع واقعی و نوع پیچیده یا مختلط. همچنین درمورد نوع Specifier در فرترن نیز ، توضیحاتی خواهیم داد.
اعداد صحیح می توانند فقط مقادیر عدد صحیح را نگه دارند. مثال زیر، بزرگترین مقدار را که می تواند در یک عدد صحیح چهار بایت معمول نگه داشته شود استخراج می کند :
1 2 3 4 5 6 7 | program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 | 2147483647 |
لطفا توجه داشته باشید که تابع ()huge بزرگترین عددی را می دهد که می تواند توسط نوع داده اعداد صحیح خاص نگهداری شود. شما همچنین می توانید تعداد بایت ها را با استفاده از مشخص کننده نوع تعیین کنید. مثال زیر این را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 4 5 | 32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 2147483647 |
اعداد اعشاری از قبیل ۲٫۰، ۳٫۱۴۱۵، -۱۰۰٫۸۷۶ و غیره در گروه اعداد حقیقی ذخیره می شوند.
معمولا دو نوع مختلف اعداد واقعی وجود دارد: نوع پیش فرض واقعی و نوع دقت دوگانه.
با این حال، Fortran 90/95 کنترل بیشتری بر دقت انواع داده های واقعی و صحیح را از طریق مشخص کننده نوع فراهم می کند، که ما در کوتاه مدت آن را مطالعه خواهیم کرد.مثال زیر استفاده از نوع داده واقعی را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 | 0.666666687 0 |
این نوع عدد برای ذخیره سازی اعداد پیچیده استفاده می شود. یک عدد مختلط دو بخش دارد: قسمت واقعی و قسمت خیالی.
دو واحد ذخیره سازی عددی متوالی این دو بخش را ذخیره می کنند.
به عنوان مثال، عدد مختلط (۳٫۰، -۵٫۰) برابر با ۳٫۰ – ۵٫۰i
تابع عمومی ()cmplx یک عدد مختلط را ایجاد می کند. یک نتیجه را که بخش های واقعی و خیالی آن دقیق است بدون در نظر گرفتن نوع استدلال ورودی ایجاد می کند .
1 2 3 4 5 6 7 8 | program createComplex implicit none integer :: i = 10 real :: x = 5.17 print *, cmplx(i, x) end program createComplex |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 | (10.0000000, 5.17000008) |
برنامه زیر اعداد مختلط ریاضی را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 4 5 | (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) |
محدوده اعداد صحیح، دقت و اندازه اعداد با توجه به تعداد بیت های اختصاص داده شده به نوع داده خاص بستگی دارد.
جدول زیر، تعداد بیت ها و محدوده برای عدد صحیح را نشان می دهد :
تعداد بیت | حداکثر اندازه | دلیل |
۶۴ | ۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۴,۸۰۷ | (۲**۶۳)–۱ |
۳۲ | ۲,۱۴۷,۴۸۳,۶۴۷ | (۲**۳۱)–۱ |
جدول زیر، تعداد بیت ها، کوچکترین و بزرگترین مقدار و دقت برای اعداد واقعی را نشان می دهد.
تعداد بیت ها | بزرگترین مقدار | کوچکترین مقدار | دقت |
۶۴ | ۰٫۸E+308 | ۰٫۵E–۳۰۸ | ۱۵-۱۸ |
۳۲ | ۱٫۷E+38 | ۰٫۳E–۳۸ | ۶-۹ |
مثال زیر این را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 | program rangePrecision implicit none real:: x, y, z x = 1.5e+40 y = 3.73e+40 z = x * y print *, z end program rangePrecision |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 4 5 6 7 8 | 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) |
اکنون اجازه دهید که از کوچکترین عدد استفاده کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 | Infinity 0.402144760 |
حالا اجازه دهید جریان زیر را ببینیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 4 5 6 7 8 9 | y = 3.73e-60 1 Warning : Real constant underflows its kind at (1) Executing the program.... $demo 0.00000000E+00 Infinity |
در برنامه نویسی علمی، اغلب نیاز به دانستن محدوده و دقت اطلاعات پلت فرم سخت افزار که در آن کار انجام می شود هست.
نوع تابع ()kind اجازه می دهد تا قبل از اجرای یک برنامه اطلاعات دقیق بازنویسی داده های سخت افزاری را جستجو کنید.
1 2 3 4 5 6 7 8 9 10 11 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 | Integer 4 Real 4 Complex 4 |
همچنین شما می توانید انواع همه داده ها را بررسی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
هنگامی که شما برنامه فوق را اجرا و کامپایل میکنید، نتیجه زیر تولید می شود :
1 2 3 4 5 | Integer 4 Real 4 Complex 4 Character 1 Logical 4 |
آموزش نوع Specifier در فرترن و اعداد به پایان رسید. امیدوارم از مطالب ذکر شده بهره کافی را برده باشید با ما همراه باشید تا در جلسه بعد نقش کارکترها در فرترن را آموزش ببینید.