با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، در این جلسه از آموزش های دوره فرترن ، دقت عددی در فرترن را آموزش می دهیم. در نسخه های قدیمیتر Fortran، دو نوع دقت عددی در فرترن وجود دارد: نوع حقیقی پیش فرض و نوع دقت دوگانه. با این حال، Fortran 90/95 کنترل بیشتری بر دقت انواع داده های حقیقی و صحیح را از طریق مشخصه خاصی فراهم می کند. ویژگی نوع در فرترن ، انواع مختلف اعداد در داخل کامپیوتر به طور متفاوت ذخیره می شوند. ویژگی نوع به شما اجازه می دهد تا مشخص کنید که چگونه یک عدد ذخیره می شود.
در ابتدا با آوردن مثال برای درک بیشتر این مفهوم شروع می کنیم.
1 2 3 4 | 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 داشته باشند. اگر چه این به ماشین نیز وابسته است.
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
هنگامی که شما برنامه بالا را اجرا و کامپایل می کنید خروجی زیرا مشاهده می کنید :
1 2 3 | default kind for real is 4 default kind for int is 2 extended kind for real is 8 |
تعدادی از توابع درونی وجود دارد که به شما امکان می دهد که اندازه اعداد را بازجویی کنید.
برای مثال، تابع ذاتی (bit_size(i تعداد بیت های مورد استفاده برای ذخیره سازی را مشخص می کند. برای اعداد حقیقی، تابع درونی (precision(x، تعداد دقت های دقيق را بر می گرداند، درحالی که تابع درونی (range(x محدوده دهدهی نمايشگر را باز می گرداند.
مثال
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 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 |
هنگامی که کدهای بالا را اجرا و کامپایل می کنید نتیجه زیر تولید می شود :
1 2 3 4 5 6 7 8 9 10 | 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 دو توابع درونی دیگر را برای بدست آوردن ارزش نوع برای دقت مورد نیاز از عدد صحیح و حقیقی فراهم می کند .
تابع select_real_kind یک عدد صحیح را بازمی گرداند که مقدار پارامتر نوع مورد نیاز برای یک دقت دهدهی p و محدوده r اعشاری است.
دقت دهدهی، تعداد رقم های قابل توجهی است و محدوده اعشاری اعشار کوچکترین و بزرگترین عدد را نشان می دهد.
بنابراین دامنه از ۱۰-r به ۱۰ + r است.
به عنوان مثال،
(selected_real_kind (p = 10، r = 99 مقدار نوع مورد نیاز برای دقت ۱۰ رقم اعشار، و محدوده حداقل ۱۰-۹۹ تا ۱۰ + ۹۹ را نشان می دهد.
مثال
1 2 3 4 5 6 7 8 | 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 |
هنگامی که کدهای بالا را اجرا و کامپایل می کنید نتیجه زیر تولید می شود :
1 | selected_real_kind (p = 10, r = 99) 8 |
دز این جلسه آموختید که منظور از دقت عددی در فرترن چیست و با برخی توابع مربوط به آن آشنا شدید.امیدوارم از مطالب ذکر شده بهره کافی را برده باشید.با ما همراه باشید تا در جلسه بعد کتابخانه های برنامه در فرترن را آموزش ببینید.