اعداد اعشاری برای نمایش مقادیری استفاده میشود که اندازهشان بسیار بزرگتر یا کوچکتر از حدی است که بتوان با نوع داده ممیز ثابت یا Integer آنها را نمایش داد. از نوع داده Float به منظور به کمینه رساندن خطا در دقت محاسبات استفاده میشود. بهخصوص در محاسباتی که مقادیر از لحاظ بزرگی با هم تفاوت زیادی دارند. برای اینکه درک کنیم نوع داده Float در برنامه نویسی چیست، باید بدانیم متغیری که برای ذخیره اعداد دارای دو قسمت کامل و اعشار است با استفاده از نوع داده Float نمایش داده میشود.
در این مطلب از مجله فرادرس درباره نوع داده Float صحبت میکنیم. خواص این نوع داده و کاربردش را توضیح دادهایم. سپس انواع خطاهای موجود در زمان کار با Float و قوانین مربوط به استفاده از این نوع داده را بررسی میکنیم. در نهایت هم سینتکس مربوط به استفاده از Float را در چند زبان مختلف نمایش داده و تفاوتش با نوع داده Integer را نیز توضیح دادهایم.
Float در برنامه نویسی چیست؟
نوع داده Float برای ذخیرهسازی اعداد اعشار استفاده میشود. به عبارت دیگر، برای کار با مقادیر عددی پیوسته و آنالوگ از اعداد Float استفاده میکنیم. این اعداد وضوح بیشتری نسبت به اعداد صحیح دارند. اعداد اعشار در کامپیوتر را میتوان با مبدِل IEEE-754 به اعداد باینری یا اعداد در مبنای شانزده نیز تبدیل کرد. اعداد Float در بیشترین حالت برابر با 3.4028235E+38
و در کمترین مقدار برابر با -3.4028235E+38
هستند. اطلاعات اعداد Float در ۳۲ بیت یا ۴ بایت نگهداری میشود.
عدد اعشار با ممیز شناور: به عددی میگویند که تعداد ارقام آن ثابت و محدود است اما موقعیت قرارگیری ممیز در آن کاملا شناور است. یعنی بتواند در هرجایی نسبت به عدد قرار بگیرد. به زبان دیگر تعداد ارقام اعشار، ثابت و غیرقابل تغییر نباشد. اعداد 1.23
و 87.425
و 9039454.2
مثالهایی از اعداد اعشار با ممیز شناور هستند. به این اعداد در زبان فارسی به سادگی اعداد اعشاری گفته میشود.
زبانهای برنامه نویسی مختلف، محدودیتهای اندازهای متفاوت یا روشهای تعریف مختص به خود را در کار با اعداد اعشار دارند. برای بدست آوردن اطلاعات دقیق باید به مستندات هر زبان برنامه نویسی رجوع کرد.
افزایش مهارت برنامه نویسی با فرادرس
برای اینکه بدانیم Float در برنامه نویسی چیست و محاسبات عددی را به بهترین شیوه ممکن کدنویسی کنیم، باید در کار با خود زبان برنامهنویسی نیز مهارت کافی داشته باشیم. یکی از روشهای خوب برای آموختن برنامهنویسی شرکت در کلاسهای حضوری است. اما در کلاسهای آکادمیک، علاوه بر قدیمی بودن روش تدریس، هزینههای بالایی نیز بر دانشجویان تحمیل میشود. احتمال وجود ضعف در استاد و کیفیت آموزش وجود دارد، مهمتر اینکه چنین کلاسهایی دارای چهارچوب زمانی خاصی نیز هستند. پیدا کردن کلاسی که با زمان آزاد علاقهمندان به یادگیری، هماهنگ و از لحاظ هزینه مقرون به صرفه باشد، در عین حال کیفیت آموزشی خوب را هم تضمین کند به یکی از چالشهای علاقهمندان به حوزه کامپیوتر تبدیل شده است.
خطاهای اعداد Float
متغیرهای Float میتوانند با خطاهای مربوط به گرد کردن یا دقت روبهرو شوند. زیرا اعداد Float در خانههای حافظهای با مقدار ثابت ذخیره میشوند. بنابراین نمیتوانند مقادیر عدد حقیقی را به صورت کامل نگهداری کنند. در زمانی که اعداد Float به صورت عدد باینری تغییر شکل میدهند، خطاهای مختلف ناشی از محدودیت اندازه ظاهر میشوند.
خطاهای دادههای اعشاری در زمان کار با دادههای اقتصادی، دادههای علمی، مجموعه دادههای بزرگ یا در زمان مقایسه برابری مقادیر Float برجسته میشوند. برای پیشگیری کردن از وقوع این نوع خطاها از نوع دادههای مختلف مانند Integer باید استفاده کرد یا توابع مخصوصی را برای گردکردن تعریف کنیم.همچنین میتوانیم کدهایی را برای مشخص کردن آستانه تحمل خطا پیادهسازی کنیم.
در ادامه مطلب، نمونه خطای مربوط به مقایسه برابری را همراه با راه حل پیشنهادی مشاهده میکنید.
خطای مربوط به مقایسه برابری
در زمان کارکردن با اعداد Float احتمال رخ دادن نتایج غیر منتظره وجود دارد. علت اصلی این مسئله این است که مقادیر Float میزان دقت محدودشدهای دارند. در نتیجه به صورت دقیق نمیتوانند مقدار بیشتری از قسمت اعشاری عدد را نمایش دهند. به این دلیل است که بعضی وقتها برنامهها در محاسبات عددی به صورت عجیبی کار میکنند.
علاوه بر این، پیادهسازی اعداد اعشار در بیشتر سیستمها نتایج دقیقتری – بیش از آن چه که مورد نیاز قوانین PL/I است – بهدنبال دارد. درون سیستمها، متغیرها و ثابتهای اعشاری معمولا فقط یک یا دو سطح دقت دارند. برای مثال بیشتر پیادهسازیهای اعداد اعشار با استاندارد IEEE فقط مجاز به استفاده از مقادیر اعشار «کوتاه» (Short) ۲۳ بیتی یا «بلند» (Long) ۵۲ بیتی هستند. اگرچه که نتایج دقیق بسته به میزان بهینهسازی برنامه میتوانند تغییر کنند.
برای نمونه، برنامه زیر را در نظر بگیرید.
1SAMPLE: PROCEDURE OPTIONS (MAIN);
2DECLARE
3 (F,G) FLOAT BINARY (23);
4 F = 3111;
5 G = .14;
6 IF F + G ^= 3111.14 THEN
7 PUT LIST ('UNEQUAL RESULT');
8END SAMPLE;
در واقع برنامه بالا زمانی که بر روی بیشتر سیستمها اجرا شود، پیغام UNEQUAL RESULT
را در خروجی چاپ خواهد کرد. زیرا ثابت .14
و 3111.14
را نمیتوان به صورت دقیق به عنوان اعداد اعشاری باینری نمایش داد.
- اختصاص عدد .14
به متغیر G
باعث میشود که میزان دقت در متغیر با کمک 23
بیت محاسبه شود.
- در بیشتر پیادهسازیها عملیات جمع با میزان دقت واقعی ۵۲ بیت یا بیشتر انجام میگیرد. اما باید توجه کرد که 23
بیت از این بیتها برای نمایش بخش اعشاری عدد استفاده شده است.
- میبینیم که در این بخش عملیات جمع با ثابت 3111.14
مقایسه میشود. این مقدار ثابت شامل ۲۳ یا ۵۲ بیت برای دقت میشود. برای پیادهسازی دقیق قوانین زبان فقط نیازمند ۲۰ بیت برای دقت هستیم.
- از آنجا که عدد 3111.14
به عنوان مقدار اعشار کوتاه نمایش داده شده، برای نمایش بخش 3111
، ۱۴ بیت از ۲۳ بیت استفاده شدهاند.
- بنابراین تنها ۹ بیت برای نمایش بخش اعشاری عدد باقیمانده است. به این معنا که ثابت عددی 3111.14
با مقدار ذخیره شده همین عدد در متغیر به طور کامل برابر نیست.
- حتی اگر از اعداد اعشاری بلند استفاده کنیم با اینکه مقدار ۳۸ بیت از ۵۲ بیت برای نگهداری مقدار اعشار استفاده میشوند، بازهم احتمال نابرابر شدن ثابت عددی با مقدار ذخیرهشده آن در متغیر وجود دارد. البته که این اختلاف بسیار کوچک است اما به معنای نابرابری است.
یکی از راههای حل کردن این مسئله تغییر برنامه به شکلی است که در پایین نمایش دادهایم.
1SAMPLE: PROCEDURE OPTIONS (MAIN);
2DECLARE
3 (F, G, H) FLOAT BINARY (23);
4 RESULT FLOAT BINARY (23) STATIC INITIAL (3111.14)
5 F = 3111;
6 G = .14;
7 H = F + G
8 IF H ^= 3111.14 THEN
9 PUT LIST ('UNEQUAL RESULT')
10END SAMPLE;
این کد بنظر میرسد که اندازه دقت عملیات جمع را به 23
بیت محدود کرده است و آن را با مقدار ثابت دقیق شناخته شدهای مقایسه کرده است.
این کار معمولا به خوبی جواب میدهد. اما در زمان انجام بهینهسازی، مقدار F + G
میتواند بدون کاهش دقت بهکار برده شود. زیرا این مقدار، بهجای اینکه در متغیر H
ذخیره شده و سپس از این متغیر دوباره فراخوانی شود، به صورت عینی F + G = 3111.14
مورد استفاده قرار میگیرد.
بنابراین، به عنوان یک قانون عمومی: مقایسه کردن اعداد اعشار برای برابری و نابرابری به صورت شایسته کار نمیکند. در عوض برای رسیدن به جواب باید برابری را با استفاده از تکنیک زیر مقایسه کنیم.
1ABS(FIRST-SECOND) < EPSILON
در کد بالا با در نظر گرفتن هدف اپلیکیشن باید مقدار ثابت EPSILON
را تایین کرد.
عملگرهای مقایسهای در همه زبانهای برنامهنویسی از نمادهای یکسانی استفاده میکنند. البته با توجه به تعاریف متفاوت زبانها بر روی نوعهای داده، ممکن است که تفاوت البته جزئی در رفتار با هم داشته باشند. در صورتی که نسبت به عملگرهای مقایسهای کنجکاو شدهاید میتوانید با مطالعه مطلب عملگر های مقایسه ای در پایتون به زبان ساده با مثال و کد از مجله فرادرس شناخت کاملی نسبت به این عملکردها در زبان پایتون و تقریبا کاملی در سایر زبانها بدست بیاورید.
خطا مربوط به دقت در عملیات محاسباتی
برای این که ببینیم، نمونهای از خطای مربوط به دقت در کار با Float در برنامه نویسی چیست، در کادر پایین مثالی را با زبان برنامه نویسی پایتون پیادهسازی کردهایم.
1a = 0.1
2b = 0.000001
3print(f"a: {a}")
4print(f"a showing more decimal places: {a:.30f}")
5print(f"b: {b:f}")
6print(f"b showing more decimal places: {b:.30f}")
7sum = a + b
8print(f"{a} + {b:f} = {sum:.30f}")
خروجی حاصل از اجرای کد بالا به صورت زیر میشود.
a: 0.1 a showing more decimal places: 0.100000000000000005551115123126 b: 0.000001 b showing more decimal places: 0.000000999999999999999954748112 0.1 + 0.000001 = 0.100001000000000006551204023708
بایدها و نبایدهای Float در برنامه نویسی چیست؟
در زمان تعریف مقادیر Float باید مقدار اعشار را با کمک نقطه بر روی عدد تعریف کنید. البته در زبانهای مختلف قواعد متفاوتی نیز وجود دارد اما معمولا در زمان تعریف باید از نقطه نیز به عنوان نماد اعشار استفاده کنیم. در غیر این صورت با عدد مانند عدد صحیح رفتار میشود.
اعداد Float از ۶ تا ۷ رقم برای نمایش دقیق اعداد استفاده میکنند. این تعداد کل ارقام عدد را تعیین میکند، نه تعداد رقمهای سمت راست نقطه. در بعضی از پلتفرمها در زمان نیاز به دقت بیشتر، میتوانیم از نوع داده Double در برنامهنویسی استفاده کنیم. دادههای نوع داده Double میتوانند تا ۱۵ رقم را شامل شوند.
اعداد Float دقیق نیستند و در زمان مقایسه ممکن است نتایج عجیبی ایجاد کنند. برای مثال جواب مسئله 9.0 / 0.3
احتمالا به طور کامل برابر با 30.0
نمیشود. برای حل این دسته از خطاها در عوض مقایسه برابری، باید بررسی کنیم که قدر مطلق اختلاف بین اعداد کمتر از یک مقدار بسیار کوچک ABS(FIRST-SECOND) < EPSILON
باشد. در این باره در قسمت بالایی مطلب مثالی را نمایش دادهایم.
همچنین محاسبات ریاضی اعداد اعشار بسیار کندتر از محاسبات ریاضی اعداد صحیح انجام میگیرد. بنابراین اگر حلقهای بخواهد با بالاترین سرعت ممکن در «تابع زمانبندی بحرانی» (Critical Timing Function) اجرا شود، نباید از اعداد اعشار در محاسبات درون حلقه استفاده کرد. برنامهنویسان معمولا برای افزایش سرعت محاسبات، اعداد اعشار را به اعداد صحیح تبدیل میکنند.
سینتکس کدنویسی Float در برنامه نویسی چیست؟
در حوزه برنامهنویسی است که به موضوعات مربوط به نوعهای داده عددی مانند Integer و Float علاقهمند میشویم. بنابراین ارزش وقت گذاشتن و مرور کدهای مرتبط را دارد. در این بخش نحوه پیادهسازی و استفاده از نوع داده Float را در چند زبان برنامهنویسی نمایش داده و به تفاوت این نوع داده با Integer هم اشاره کردهایم.
برای اینکه در زمینه کدنویسی حرفهایتر شویم بهتر است فیلم آموزش برنامه نویسی پایتون تکمیلی همراه با بهینه کردن کدها را از فرادرس مشاهده کنیم. کدهای این فیلم با اینکه مربوط به زبان برنامهنویسی پایتون است اما قواعد کلی مطرح میشود که در سایر زبانها نیز قابل پیادهسازی هستند. لینک این فیلم را در پایین قرار دادهایم.
نوع داده Float در پایتون
در کادر زیر قطعه کد کوچکی از پایتون را پیادهسازی کردهایم. در این کد دو متغیر، یکی به نمایندگی از نوع داده Float و دیگری به نمایندگی از نوع داده Integer، تعریف کردهایم. در زبان پایتون نیازی به تعریف نوع متغیرها به صورت مشخص نیست. یک متغیر میتواند مقادیری از هر دو نوع داده Integer و Float را بپذیرد.
1integer_value = 10
2float_value = 3.14
3
4
5print(integer_value) # Output: 10
6print(float_value) # Output: 3.14
نوع داده Float در جاوا
زبان برنامه نویسی جاوا یکی دیگر از زبانهای مشهور و پرطرفدار است. در جاوا قبل از تخصیص دادن هر مقداری به متغیرها باید نوع آنها را مشخص کنیم. غیر از تعریف اولیه برای نوع داده Float از حرف f
در انتهای مقدار نیز استفاده کردهایم.
در کادر زیر مثال کدنویسی با زبان جاوا درباره تعریف و استفاده از Integer و Float را نمایش دادهایم.
1int integerValue = 5;
2float floatValue = 2.718f;
3
4
5System.out.println(integerValue); // Output: 5
6System.out.println(floatValue); // Output: 2.718
نوع داده Float در ++C
در زبان برنامه نویسی ++C در موقعیتی مشابه با زبان جاوا هستیم. یعنی باید قبل از مقداردهی متغیرها نوع داده آنها را مشخص کنیم. البته از حرف f
در انتهای مقدار مربوط به نوع داده Float خبری نیست.
در تکه کد زیر نحوه تعریف متغیر فلوت را در زبان برنامهنویسی ++C مشاهده میکنیم.
1float floatValue = 1.5;
2
3
4cout << floatValue << endl; // Output: 1.5
نوع داده Float در جاوا اسکریپت
در آخر، نوبت به بررسی مثالی با زبان برنامه نویسی جاوا اسکریپت رسیده است. در زبان جاوا اسکریپت هم نوعهای داده پویا هستند، بنابراین مانند زبان پایتون کار میکنند. متغیر یکسان میتواند انواع داده Integer و Float و غیره را بپذیرد.
در کادر پایین مثال کوچکی از تعریف و استفاده متغیرهای Integer و Float را کدنویسی کردهایم. البته به کلمه var
قبل از نام متغیر توجه کنید. این کلمه در زبان پایتون استفاده نمیشود.
1var integerValue = 15;
2var floatValue = 0.5;
3
4
5console.log(integerValue); // Output: 15
6console.log(floatValue); // Output: 0.5
زبان های مختلف و پیاده سازی های متفاوت
زبانهای برنامهنویسی مختلف با توجه به عملیات بر روی نوع داده Float، ممکن است که قوانین و رفتارهای متفاوتی را در پیش بگیرند. همیشه مهم است که برای درک بهتر جزئیات و اشتباهات احتمالی زمان کار در هر زبان برنامهنویسی به مستندات مربوط به آن زبان مراجعه کنیم.
آموزش تخصصی برنامه نویسی با استفاده از تمرینات پروژه محور
آموزش زبانهای برنامه نویسی شامل مراحل و سطوح علمی مختلف است. از مراحل پایه و مقدماتی برای آشنایی با سینتکس زبان و مفاهیمی مانند حلقهها، نوعهای داده، عبارات شرطی و غیره گرفته تا مراحل پیشرفته و مفاهیم تخصصی مانند شیء گرایی را شامل میشود. اما آخرین مرحله در آموزش برنامهنویس به منظور ورود به دنیای واقعی و بازار کار، معمولا اجرای تمرینات پروژه محوری است که قابل ارائه در دنیای واقعی نیز هستند. از طراحی سایت گرفته تا طراحی مدلهای هوش مصنوعی و ساخت اپلیکیشنهای کاربردی، دورههایی هستند که هر کدام مهارتهای مخصوص به خود را نیاز دارند.
در اجرای بعضی از پروژهها لازم است که حتی از چند زبان برنامهنویسی و چند تکنولوژی مختلف در کنار هم استفاده کنیم. در این بخش چند مورد از فیلمهای آموزشهای حرفهای پروژه محور برنامهنویسی توسط زبانهای مختلف را که در فرادرس آماده شده معرفی میکنیم. فرادرس برای تهیه این فیلمهای آموزشی حداکثر حساسیت را بهکار برده تا مفیدترین گزینههای ممکن را در دسترس مخاطبان عزیز قرار دهد.
در صورت تمایل با کلیک بر روی تصویر بالا، به فیلمهای آموزشی بیشتری دسترسی خواهید داشت.
جمع بندی
Integer-ها اعداد کامل را بدون قسمت اعشاری نمایش میدهند. اما نوع داده Float برای نمایش اعداد اعشار استفاده میشود. با توجه به ۳۲ بیت برای ذخیره مقادیر اعشار توسط Float، استفاده از این نوع داده مصرف حافظه بیشتری را در کنار میزان بالاتر دقت نسبت به Integer در پی دارد. درحالی که دقت اعداد Float محدود شده میتوانند اعداد اعشار را نیز نمایش دهند. این اصول تقریبا در همه زبانهای برنامهنویسی برقرار هستند.
در این مطلب از مجله فرادرس به بررسی اینکه Float در برنامه نویسی چیست پرداختیم. سینتکس مربوط به استفاده از این نوع داده را در چند زمان مختلف نمایش داده و بعضی از خطاهایی ممکن مربوط به کار با Float را بررسی کردیم.
source