نوع داده Double یکی از ساختارهای مورد استفاده برای کار با اعداد در کامپیوتر است. از Double برای نمایش اعداد حقیقی استفاده میشود. به طور کل، Double برای توانایی کار با دقت بسیار بالاتر در مقادیر اعشاری و نمایش اعداد با مقادیر بسیار بزرگ استفاده میشود. در نگاه اول، Double شبیه به نوع داده Float است اما این دو با هم دارای تفاوتهای مهمی هستند. برای رسیدن به درک درستی درباره اینکه فایده استفاده از Double در برنامه نویسی چیست، باید توجه کنیم، این نوع داده برای نگهداری متغیرهایش از ۶۴ بیت در حافظه استفاده میکند. بنابراین، دو برابر شدن تعداد بیتها به نوع داده Double کمک میکند که بتواند از اعداد بسیار بزرگتر و دقت بسیار بیشتری در محاسبات بهرهمند شود.
در این مطلب از مجله فرادرس به بررسی نوع داده اعشاری خاصی به نام Double میپردازیم. خواهیم دید که نوع داده Double در برنامه نویسی چیست. چه تفاوتی با نوع داده Float دارد و چگونه و در چه موقعیتهایی باید از آن استفاده کرد. امتیازاتی که استفاده از این نوع داده دارد را همراه با خطاهایی که باید از آنها دوری کرد، بررسی میکنیم.
Double در برنامه نویسی چیست؟
Double دادهای از جنس عدد است که برای نمایش اعداد با مقادیر اعشار استفاده میشود. البته از این نوع داده در محاسبات عددی با مقادیر بسیار بزرگ هم میتوان استفاده کرد. در نگاه اول، این نوع داده شبیه به نوع داده Float است اما دارای تفاوتهای مهمی با یکدیگر هستند. برنامه نویسان حرفهای نسبت تفاوتهای بین نوع داده Float و Double باید آگاه باشند.
کلمه Double حالت کوتاه شدهای از عبارت «دقت مضاعف» (Double Precision) است. همینطور که از نام نوع داده مشخص است متغیرهای Double همیشه بری دو برابر کردن دقت استفاده میشوند. این نوع داده برای نگهداری متغیرهایش از ۶۴ بیت در حافظه استفاده میکند. در حالی که نوع داده Float با ۳۲بیت متغیرها را در حافظه ثبت میکند. دو برابر شدن تعداد بیتها به نوع داده Double کمک میکند که بتوانند از اعداد بسیار بزرگتر و دقت بسیار بیشتری در محاسبات بهرهمند شوند.
بین نوع داده Double و Float تفاوتهای کلیدی وجود دارد که میتواند در کیفیت محاسبات نیز اثر گذاری خود را نشان دهد. این تفاوتها را در فهرست پایین همراه با توضیح کاملی برای هر کدام فهرست کردهایم.
- «ارقام دقت» (Digits of Precision): این مورد تفاوت اصلی بین نوع دادههای Float و Double است. دقت نوع داده Float نسبت به Double کمتر است. این مطلب دقیقا مربوط به تعداد ارقامی است که هر کدام از نوعهای داده میتوانند نمایش دهند. با استفاده از نوع داده Float، احتمالا بعد از ۶ یا ۷ عدد اعشار کم کم دقت محاسبات را از دست میدهیم. در حالی که نوع داده Double میتواند تا ۱۵ رقم اعشار را به درستی محاسبه کند.
- «میزان حافظه مصرفی» (Memory Usage): همینطور که در بالا اشاره کردیم، اعدا فلوت برای ذخیره در حافظه از ۳۲بیت استفاده میکنند که به معنی مصرف حافظه خیلی کمتر از نوع داده Double است. زیرا Double هر عدد را با ۶۴ بیت، یعنی با دو برابر حافظه بیشتر ذخیره میکند. این تعداد بیت برای ذخیرهسازی مقادیر نه تنها بر روی دقت اعداد موثر است بلکه نحوه مصرف حافظه توسط برنامه را نیز تعیین میکند.
- «محدوده مقادیر» (Range of Values) قابل پشتیبانی: بخاطر اندازه بزرگتر، Double-ها میتوانند محدوده گستردهتری از مقادیر عددی را نیز پشتیبانی کنند. این کار باعث میشود که در سناریوهای که مقادیر مورد استفاده تفاوتهای بسیار بزرگی با هم دارند استفاده از نوع داده Double مفیدتر باشد.
اعداد اعشار در کامپیوتر چه هستند؟
اگر با برنامه نویسی آشنا هستید حتما با اسم نوع داده اعشار Float آشنا هستید. اما بین نوع داده Float و نوع داده Double تفاوتهایی هست که برای حرفهای تر شدن باید با آنها نیز آشنا شوید.
در صورت کار کردن با اعداد در برنامهنویسی حتما با این مفاهیم نیز برخورد کردهاید. از آنجا که این نوع دادهها برای مدیریت محدوده خاصی از مقادیر بسیار پرکاربرد و ضروریاند، یکی از نوعهای دادهای هستند که در هر ابزار برنامهنویسی وجود دارند.
«اعداد اعشاری» (Floating-Point Numbers) روشی برای نمایش اعداد حقیقی در برنامهنویسی هستند که به برنامهنویسان برای کار با طیف گستردهای از اعداد -از اعداد بسیار کوچک گرفته تا اعداد فوقالعاده بزرگ- کمک میکنند.
جمله بالا به این معنا است که عدد اعشاری میتواند هردو قسمت کسری و صحیح اعداد را با تمام درجات دقت نمایش دهند. درحالی که نوع داده Integer فقط میتواند قسمت صحیح اعداد را نمایش دهد آنهم بدون هیچ بخش اعشاری. همین انعطافپذیری این نوع داده است که آن را برای برنامهنویسی بسیار کاربردی و مفید کرده است.
در حقیقت، مفهوم اعداد اعشاری، جدید نیست و تقریبا از اولین روزهایی که انسان نیاز به محاسبات عددی پیدا کرد این اعداد نیز وجود داشتند. اگرچه این اعداد همزمان با نیاز بیشتر به محاسبات عددی دقیق تر و متنوع تر، دائماً در حال تغییر هستند.
هدف اصلی این است که روشی برای نمایش اعداد در مقیاسهای خیلی بزرگ و خیلی کوچک ارائه داده شود. توان استفاده از چنین ساختار عددی در حوزههایی مانند محاسبات علمی، پردازشهای گرافیکی و تحلیل بازار بسیار ضروری است.
البته افراد تازه وارد در دنیای برنامهنویسی معمولا ترجیح میدهند که از نوع داده Integer استفاده کنند. البته که Integer برای شمارش بسیار عالی است. شمارش ایندکسهای لیستها یا تعداد گردش حلقهها با کمک اعداد صحیح انجام میشود. در مواردی که دقت محاسبات چندان مهم نیست میتوان از نوع داده Integer استفاده کرد. اما در موارد نیاز به استفاده از مقادیر اعشار یا محاسبه دقیق کسری از اعداد، استفاده از نوع داده Integer مناسب نیست.
درباره محاسبات علمی، تبدیل ارز یا هرچیز سادهای مانند اندازهگیری وزن یا طول فکر کنید. با کمک اعداد اعشار است که میتوان این سناریوها را به صورت موثری مدیریت کرد.
در بیشتر زبانهای برنامهنویسی، اعداد اعشار با شکل استاندار آن که توسط IEEE معرفی شده نمایش داده میشوند. IEEE سرنام عبارت «انجمن مهندسان برق و الکترونیک» (Institute of Electrical and Electronics Engineers) است.
تبعیت از شکل استانداری که IEEE تعریف کرده است، باعث ثبات و پایداری محاسبات و برنامهها بر روی سیستمهای مختلف و در زبانهای برنامهنویسی گوناگون میشود. در نتیجه به طور حتم اجرای عملیات ریاضی بر روی اعداد اعشار را نیز سادهتر میکند.
چه اینکه در حال محاسبه مسیر حرکت فضاپیمایی هستید یا فقط اطلاعات مربوط به حساب دسته چک خود را صورتبرداری میکنید، استفاده از اعداد اعشار یکی از بهترین ابزار برای محافظت از دقت در محاسبات خود و تضمین کیفیت پاسخ این محاسبات است.
دو نوعِ داده به نامهای Float و Double برای نمایش اعداد اعشار در برنامهنویسی وجود دارند. در این مطلب به بررسی اینکه Double در برنامه نویسی چیست میپردازیم. همچنین به تفاوتهای این نوع داده با Float نیز اشاره کوتاهی میکنیم.
در چه زمان هایی از نوع داده Double استفاده کنیم؟
بعضی از افرادی که تازه برنامهنویسی را شروع کردهاند و غالبا از زبان برنامه نویسی ++C برای نوشتن کدها استفاده میکنند، به طور عمده استفاده از نوع داده Double را به استفاده از Float ترجیح میدهند. زیرا بهسادگی فکر میکنند که داشتن دقت بیشتر در محاسبات انتخاب خوبی است. اما به خوبی متوجه این نکته نشدهاند که جابهجایی و استفاده از هر کدام از نوع دادههای Double و Float زمان و مکان مخصوص به خود را دارد.
نکته اصلی این است که برای انتخاب بین Double و Float باید به نیازهای اپلیکیشن خود توجه کنیم. اگر بخواهیم که از حافظه سیستم محافظت کنیم و در محاسباتمان نیز نیازی به دقت مضاعف نیست، احتمالا استفاده از نوع داده Float کافی و مناسب است.
از طرف دیگر، برای اپلیکیشنهایی که دقت محاسبات در آنها حیاتی است، مانند محاسبات علمی یا الگوریتمهای پیچیده، استفاده از نوع داده Double احتمالا گزینه خیلی بهتری خواهد بود.
در بخشهای بعدی، میبینیم که زبانهای برنامه نویسی مختلف چگونه نوع داده Double را پیادهسازی میکنند. همچنین چند مثال کدنویسی شده را بررسی خواهیم کرد. بررسی مثالهای کدنویسی شده، درک بهتری درباره استفاده از این نوع داده در سناریوهای دنیای واقعی به برنامهنویسان میدهد.
نکته: توجه کنید که انتخاب بین نوع داده Double و Float میتواند به طرز چشمگیری بر روی دقت و کارآیی برنامه تاثیر بگذارد. بنابراین، این انتخابی است که ارزش زمان گذاشتن برای تفکر و تصمیمگیری را دارد.
افزایش مهارت برنامه نویسی با فرادرس
برای بهترین بهرهبرداری از اطلاعات در زمینه کار با محاسبات عددی و بهخصوص اعداد اعشار در زبان برنامهنویسی، باید در کار با خود زبانهای برنامهنویسی نیز مهارت کافی داشته باشیم. به عنوان یکی از روشهای خوب برای آموختن برنامهنویسی میتوان از شرکت در کلاسهای حضوری نام برد. اما باید توجه کرد در کلاسهای آکادمیک، علاوه بر قدیمی بودن روش تدریس، هزینه بالایی نیز بر دانشجویان تحمیل میشود. ریسک پایین بودن کیفیت آموزش وجود دارد و مهمتر اینکه چنین کلاسهایی دارای چهارچوب زمانی خاصی نیز هستند. بنابراین پیدا کردن آموزشگاهی که با زمان آزاد علاقهمندان به یادگیری، هماهنگ و از لحاظ هزینه مقرون به صرفه باشد، در عین حال کیفیت آموزش خوبی را هم تضمین کند کمی دشوار است.
روش استفاده از Float و Double در برنامه نویسی چیست؟
وقتی که نوبت به استفاده از نوع دادههای Double و Float میرسد، هر زبان برنامهنویس، روش منحصر بهفرد خود را برای مدیریت این نوعهای داده ارائه میدهد.
در این بخش نگاه سریع و در عین حال کاملی به روش استفاده هر زبان برنامهنویسی از این نوعهای داده خواهیم داشت.
زبان های C و ++C
زبانهای C و ++C روشهایی شبیه به هم دارند. نکات مربوط به این تفاوتها را در ۳ مورد خاص فهرست کردهایم.
- زبانهای C و ++C اعداد اعشار با دقتهای مختلف را با نوع دادههای Double و Float و روشهای متفاوتی بهکار میبرند.
- نوع داده Float دقت ثابتی را با استفاده از ۳۲بیت برای نمایش اعداد اعشار ارائه میدهد. در حالی که نوع داده Double به علت استفاده از ۶۴ بیت برای هر عدد، محاسبات را با دقت دو برابر بیشتر انجام میدهد.
- زبان ++C نوع داده Long Double را نیز ارائه میدهد که باز هم دقت بیشتری را در محاسبات بدست میآورد. هر چند اندازه متغیرها و میزان دقت در Long Double با توجه به سیستم سختافزاری مورد استفاده فرق میکند.
زبان Java
زبان برنامه نویسی Java، هم در مقابل نوع دادههای Double و Float رفتار یکسانی را در پیش میگیرد.
- زبان Java در مقابل نوع داده Float، رویکردی مشابه با زبان برنامه نویسی C را در پیش میگیرد. یعنی اعداد Float را به صورت ۳۲بیتی و اعداد اعشار Double را به صورت ۶۴ بیتی مورد محاسبه و ذخیرهسازی قرار میدهد.
- برنامههای Java، در محاسبات اعشاری، پایبندی بسیار سختی بر استاندارهای IEEE دارند. به این معنی که رفتارهای Double و Float قابل پیشبینی بوده و بر روی پلتفرمهای گوناگون ثابت و سازگار هستند.
زبان #C
زبان برنامه نویسی #C هم از خانواده زبان C است که در نتیجه رفتاری مشابه با سایر اعضای خانواده خود را در مقابل با این نوع دادهها در پیش گرفته است.
- زبان #C نیز این دو نوع داده Double با ۶۴ بیت حافظه و Float با ۳۲بیت را به منظور بهرهمندی برنامهها از سطوح دقت متفاوت به برنامهنویسان ارائه داده است.
- زبان #C درباره وفاداری به استانداردهای IEEE رفتاری شبیه به رفتار زبان Java را در پیش گرفته و تضمین میکند که برنامههای این زبان بر روی سیستمهای مختلف دارای رفتار یکسان و با همه پلتفرمها سازگار باشند.
زبان Python
زبان برنامه نویسی Python در مقابله با نوع داده Double رویکرد کمی متفاوتتری در پیش میگیرد.
- زبان Python در مقابل نوع دادههای Double و Float رویکرد متفاوتی در پیش میگیرد. در این زبان برنامهنویسی فقط یک نوع داده عددی اعشار به نام Float وجود دارد. این نوع داده بر اساس نوع داده Double در زبان C پیادهسازی شده است. یعنی از ۶۴ بیت برای نگهداری و کار با مقادیر عددی استفاده میکند.
- این سادهسازی به معنای این است که به طور معمول برای استفاده از اعداد اعشار مجبور به انتخاب بین دقت معمولی و دقت دو برابر نیستیم. در نتیجه کار کردن با اعداد در پایتون بسیار ساده شده است.
زبان JavaScript
زبان برنامه نویسی JavaScript نیز در این حوزه رویکردی شبیه به رویکرد زبان پایتون را در پیش گرفته است.
- JavaScript از آن جهت منحصر بهفرد است که به صورت صریح نوع دادهای به نام Double یا Float را تعریف نکرده است. در این زبان فقط یک نوع داده برای ذخیره اعداد اعشار با ۶۴ بیت مانند Double تعریف شده است.
- برای کاربردهای خاص، JavaScript آرایههای نوع خاصی را به نامهای Float32Array و Float64Array ارائه میدهد. این آرایهها میتوانند شبیه به نوع دادههای Double و Float عمل کنند.
زبان های Swift و Kotlin و Go و Rust
زبانهای برنامهنویسی Swift و Kotlin و Go و Rust نیز تقریبا از رویکرد یکسان و شبیه به همی استفاده میکنند.
- این زبانهای برنامهنویسی جدیدتر نیز انواع مجزایی از نوع دادههای Double و Float را تعریف و ارائه کردهاند.
- برای نمونه، Swift و Kotlin نیز از نوع دادههای Double و Float پشتیبانی میکنند. این نوع دادهها با ۳۲بیت و ۶۴ بیت مصرف حافظه در عوض هر مقدار عددی، طبق معمول سطوح متفاوتی از دقت در اعداد اعشار را ارائه میدهند.
- زبان Go از float32 و float64 استفاده میکند و زبان Rust به نام f32 و f64 از این نوعهای داده استفاده میکند. از نامگذاری آنها مشخص است که کدام یک به میزان استفاده از ۳۲بیت و کدام یک به ۶۴ بیت اشاره میکنند.
در بخش بعدی چند مثال کدنویسی شده درباره این نوعهای داده را بررسی کردهایم تا روش کار و استفاده از هر کدام را در عمل ببینیم.
مثال های کدنویسی شده درباره نوع داده Double
در این بخش چند مثال کدنویسی شده در زبانهای مختلف را نمایش دادهایم. این مثالها برای کمک به درک بهتر اینکه روش استفاده از Double در برنامه نویسی چیست ارائه شدهاند. در بعضی از مثالها نیز کارکرد Double را با نوع داده Float مقایسه کردهایم.
در این بخش میببینیم که روش تعریف و استفاده از نوع داده Double در برنامه نویسی چیست و تاثیر دقت این نوع داده را در محاسبات بررسی میکنیم.
زبانهای ++C/C
در این بخش از مطلب مثال مربوط به زبانهای ++C و C را ارائه دادهایم.
1#include <stdio.h>
2
3int main() {
4 double doubleValue = 3.14159265358979323846; // Double-precision
5
6 printf("Double value: %.15fn", doubleValue);
7
8 return 0;
9}
در کد بالا که به زبان C نوشته شده است، متغیری از جنس Double تعریف کردهایم. به عنوان مقدار عدد را با اعشار زیاد به این متغیر اختصاص دادهایم. در صورت اجرای کد بالا میبینید که این عدد به صورت کامل در خروجی چاپ خواهد شد. اما اگر در ادیتور خود متغیری را نیز از نوع Float تعریف کنید در زمان اجرا متوجه اختلاف بین این دو متغیر میشوید.
زبان جاوا
در این بخش از مطلب مثال مربوط به زبان جاوا را ارائه دادهایم.
1public class Main {
2 public static void main(String[] args) {
3 float floatValue = 3.1415927f; // Note the 'f' suffix for float
4 double doubleValue = 3.141592653589793;
5
6 System.out.println("Float value: " + floatValue);
7 System.out.println("Double value: " + doubleValue);
8 }
9}
مثال جاوا هم شباهت زیادی به مثال مربوط به زبان C دارد. کد بالا به زبان جاوا نوشته شده است. همچنین کد مقایسهای مربوط به نوع داده Float را هم در این مثال گنجاندهایم. توجه کنید که چگونه برای تعریف صریح متغیر Float در جاوا از پسوند f استفاده کردهایم. البته این پسوند مربوط به زبان جاوا است و در سایر زبانها بهکار نمیآید.
زبان برنامه نویسی جاوا یکی از محبوبترین و با سابقهترین زبانهای برنامهنویسی جهان است. توسعهدهندگان بسیاری در سراسر جهان از زبان جاوا برای توسعه برنامههای کاربردی دسکتاپ، اپلیکیشنهای موبایل، برنامههای تحت شبکه، اپلیکیشنهای سازمانی و سایر موارد استفاده میکنند. درصورتی که نسبت به زبان جاوا اطلاعات کمیدارید پیشنهاد میکنیم که مطلب مرتبط در این زمینه با عنوان جاوا چیست؟ همراه با همه دانستنی های ضروری به زبان ساده را از مجله فرادرس مطالعه کنید.
زبان پایتون
در این بخش از مطلب مثال مربوط به زبان پایتون را ارائه دادهایم.
1floatValue = 3.14159265358979323846 # Python's float is a double-precision
2
3print("Float value:", floatValue)
زبان برنامهنویسی پایتون فقط از یک نوع داده به نام «Float»برای اعداد اعشار پشتیبانی میکند. این نوع داده در واقع از نوع اعداد اعشار با «دقت مضاعف» (Double-Precision) است. این مثال روش مدیریت اعداد اعشار با ارقام بالا توسط پایتون را نشان میدهد.
زبان جاوا اسکریپت
در این بخش از مطلب مثال مربوط به زبان جاوا اسکریپت را ارائه دادهایم.
1let floatValue = 3.14159265358979323846; // JavaScript uses double-precision for Numbers
2
3console.log("Float value:", floatValue.toFixed(7)); // Limiting to 7 decimals
4console.log("Double value:", floatValue);
جاوا اسکریپت یک نوع داده عددی دارد که از نوع Double-Precision است. از متد toFixed()
استفاده کردهایم تا در زمانی که تعداد اعداد اعشار را محدود میکنیم تفاوت در دقت را نمایش دهیم.
با توجه به این مثالها میتوان دید که روش استفاده از نوع داده Double در برنامه نویسی چیست. همچنین میتوان تفاوت در استفاده و دقت بین نوع دادههای Double و Float را در زبانهای مختلف، مشاهده کرد.
با اینکه نوع داده Float برای استفاده در بسیاری از برنامهها گزینه مناسبی است، اما Double دقت بیشتری را ارائه میدهد. برای محاسباتی که در آنها خطاهای ناشی از بیدقتیهای کوچک به مرور زمان بر روی هم انباشته شده و میتوانند باعث بروز خطاهای بزرگ شوند، استفاده از اعداد Double بسیار ضروری است.
همینطور که قبلا هم اشاره کردیم، انتخاب بین نوع دادههای Double و Float، اغلب اوقات به نیازهای اپلیکیشن و محدودیتهای سیستم مورد استفاده مانند حافظه و قدرت پردازش بستگی دارد.
کارایی نوع داده Double در برنامه نویسی چیست؟
برای اینکه از نوع داده Double در زمان کدنویسی استفاده کنیم باید به تبعات استفاده از آن بر روی کارایی برنامه توجه کنیم. به طور کل این انتخاب نه تنها بر اساس میزان دقت مورد نیاز در محاسبات باید بررسی شود بلکه حتی توان منابع مورد استفاده سختافزاری برنامه نیز باید در نظر گرفته شود.
در این بخش میبینیم که ملاحظات کلیدی در انتخاب نوع داده Double در برنامه نویسی چیست. چند مورد از آنها را در پایین فهرست کردهایم.
سرعت پردازش
در مطلب پایین بررسی میکنیم که وضعیت «سرعت پردازش» (Processing Speed) دادههای Double در برنامه نویسی چیست.
- قاعده کلی: طبق روال مرسوم، با توجه به اندازه کوچکتر و محاسبات ریاضی سادهتر، نوع داده Float از Double سریعتر درنظر گرفته میشود.
- سخت افزار مدرن: اختلاف کارایی بین Double و Float بر روی بسیاری از پردازشگرهای مدرن عدد ناچیزی است. مخصوصا در محیطهای سرور و دسکتاپ این اختلاف اصلا به چشم نمیآید. حتی بعضی از معماریهای مدرن برای کار با نوع داده Double با Double-precision بهینهسازی شدهاند. این کار باعث شده که عملیات جاری بر روی نوع داده Double به سرعت یا حتی در بعضی از سناریوها سریعتر از Float باشد.
- GPU و سختافزار بهینهسازی شده: اعداد Float در برنامهنویسی گرافیکی و محاسباتی که در GPU انجام میپذیرند، اغلب سریعتر و کارآمدتر عمل میکنند. این مسئله به خاطر این است که اکثر GPU-ها به طور معمول برای محاسبات Single-Precision بهینهسازی شدهاند. این نوع از محاسبات به خوبی با الزامات محاسبات گرافیکی هماهنگ هستند.
مصرف حافظه
در این قسمت از مطلب میبینیم که وضعیت «مصرف حافظه» (Memory Usage) دادههای Double در برنامه نویسی چیست.
- اثر گذاری بر حافظه: نوع داده Double دو برابر Float حافظه اشغال میکند. بنابراین، در زمان کار با برنامههایی که با آرایهها یا «مجموعهدادههای» (Datasets) بزرگ سروکار دارند، استفاده از نوع داده Double به طرز چشمگیری فضای اشغال شده در حافظه را افزایش میدهد.
- میزان مصرف حافظه «کَش» (Cache): مصرف بیشتر حافظه به این معنا است که استفاده کارآمد از Cache کمتر میشود. این مسئله باعث کندی سرعت برنامه میشود، به خصوص اگر از مجموعهدادههای بزرگ استفاده کنیم.
مقایسه دقت و عملکرد
موارد فهرست شده در زیر وضعیت فاکتورهای «دقت» (Precision) و «کارایی» (Performance) نوع داده Double را با هم مقایسه میکنند.
- الزامات دقت: اگر برنامهای که طراحی کردیم نیاز به دقت بسیار بالایی داشته باشد بهترین گزینه استفاده از Double است. برای نمونه، محاسبات علمی جایی است که خطاهای کوچک میتوانند تکثیر و بزرگ شوند. اینجا دقت بسیار بیشتری را نیاز دارد و این دقت توسط Double برآورده میشود.
- الزامات کارایی: برای برنامههایی که کارایی و مصرف بهینه حافظه در آنها اهمیت بیشتری نسبت به دقت دارند، مانند سیستمهای «بلادرنگ» (Real-Time) یا اپلیکیشنهایی که بر روی دستگاههای با محدودیت حافظه اجرا میشوند، استفاده از نوع داده Float مناسبتر است.
ملاحظات خاص اپلیکیشن ها
در این قسمت میبینیم که ملاحظات خاص اپلیکیشنها برای استفاده از Double در برنامه نویسی چیست.
- «سیستمهای نهفته» (Embedded Systems): استفاده از نوع Double در دستگاههای نهفته یا وسایل IoT عملکرد و تاثیر Float را ندارد. چنین سیستمهایی معمولا میزان حافظه محدود و قدرت پردازشی کمتری دارند.
- ذخیره و انتقال داده: استفاده از نوع داده Double الزامات مربوط به افزایش پهنای باند و فضای ذخیرهسازی را افزایش میدهد. این اتفاق در زمان نقل و انتقال دادههای حجم بالا در شبکهها و اجرای عملیات مرتبسازی حجم انبوه دادهها میتواند باعث کندی و کاهش عملکرد کلی سیستم شود.
بهترین رویکرد برای استفاده نوع داده Double در برنامه نویسی چیست؟
برای اینکه بفهمیم تاثیر استفاده از نوع داده Double در برنامه نویسی چیست، مهم است که شرح حالی از روند کار اپلیکیشن خود تهیه کنیم. انجام بهینهسازی بدون اندازه گرفتن پارامترهای عملیاتی میتواند منجر به بروز زودهنگام عوارض غیر ضروری شود. برای همین ساخت شرح حال از روند کار، کلید تعیین رویکرد صحیح استفاده از نوع داده است.
در ضمن همیشه باید نوع داده را بر اساس نیازهای مشخص شده اپلیکیشن انتخاب کنیم. برای نمونه، در یک نرمافزار علمی دسکتاپ، ممکن است برای افزایش دقت برنامه، تمایل به انتخاب نوع داده Double داشته باشیم. درحالی که در بازی موبایل برای حفظ عملکرد استفاده از نوع داده Float کافی است.
بنابراین در زمان شک و دودلی درباره انتخاب نوع داده، به یاد داشته باشید که باید فاکتورهایی مانند دقت، سرعت پردازش، میزان محدودیت حافظه و سختافزاری میزبان اجرای برنامه را در نظر داشت. حفظ تعادل بین این فاکتورها تضمین میکند که برنامه طراحی شده محاسبات خود را به طرز موثر و کارآمدی انجام دهد.
کاربردها و استفاده عملی نوع داده Double
در قسمتهای بالایی این مطلب، درباره محل استفاده و کاربرد نوع Double صحبت کردیم. متوجه شدیم که چگونه نوع داده صحیح را انتخاب کنیم تا به طرز بسیار خوبی بر کارایی برنامه اثر مثبت بگذارد.
در این بخش چند سناریو از دنیای واقعی را بررسی میکنیم. برنامههای واقعی را معرفی میکنیم که انتخاب نوع داده صحیح در کارکردشان به طرز قابل توجهی تاثیرگذار است.
محاسبات علمی
استفاده از نوع داده Double برای بدست آوردن بیشترین دقت: در حوزههایی مانند رشته فیزیک، ستاره شناسی و شیمی، صحت و دقت محاسبات و نتایج بسیار مهم است. به همین علت است که نوع داده Double اغلب اصلیترین گزینه مورد استفاده در چنین برنامههایی است. در برنامههای علمی با چنین محاسباتی خطاهای کوچک میتوانند در طول زمان انباشته شده و باعث بروز خطاهای بزرگی در دقت عملیات شوند.
مثال: شبیه سازی دینامیک مولکولی یا محاسبات فاصلههای بین اجرام کیهانی.
اپلیکیشن های اقتصادی
در اپلیکیشنهای اقتصادی نیز دقت از اهمیت زیادی برخوردار است. در این اپلیکیشنها، گرد کردن خطاها میتواند باعث بروز مشکلات مهمی شود. به این منظور باید از نوع داده Double استفاده کنیم. اگرچه که برای جلوگیری از مشکلات محاسباتی در مقادیر پولی، استفاده از نوع داده «نقطهثابت» (Fixed-Point) یا اعشاری اختصاصیسازی شده معمولا انتخابهای بهتری هستند.
برای مثال محاسبه نرخ بهره، استهلاک وام مسکن یا مدلهای پیچیده مالی گزینههایی هستند که باید حتما با دقت بالا برآورد شوند.
اپلیکیشن های مهندسی
انتخاب نوع داده در این اپلیکیشنها وابسته به نیازمندیهای برنامه است. اپلیکیشنهای مهندسی مانند نرمافزار CAD یا برنامههای تحلیل ساختاری ممکن است از معیارهای اندازهگیری حتی بالاتری نیز استفاده کنند. برای چنین برنامههایی استفاده از نوع داده Double الزامی است. البته محاسباتی که به چنان دقت بالایی نیاز ندارند یا طراحیهای مقدماتی برنامههای مهندسی هنوز میتوانند از نوع داده Float استفاده کنند.
به عنوان مثال، تفاوتهای جزئی در طراحیهای مهندسی دقیق بسیار مهم است. در چنین طراحیهایی به استفاده از نوع داده Double نیاز داریم.
تجزیه و تحلیل داده ها و یادگیری ماشین
استفادههای ترکیبی نیز نیاز به نوع داده Double دارند. انتخاب نوع داده برای استفاده در «یادگیری ماشین» (Machinen Learning) با «علم داده» (Data Science) تفاوت دارد. شاید در آموزش مدلهای یادگیریماشین استفاده از نوع داده Double باعث بدست آوردن میزان دقت بالاتری شود، اما وقتی که آموزش تمام شد، مدلها میتوانند از Float برای ارتقای عملکرد مدل در حین استنتاج استفاده کنند. بهخصوص زمانی که از سختافزارهای اختصاصیسازی شدهای مانند GPU استفاده میکنند.
به عنوان مثال، زمانی که شبکه عصبی را با کمک سرور قدرتمندی آموزش میدهیم، نوع داده Double را بهکار میبریم. اما در زمانی که از همان مدل آموزش دیده بر روی ابزارهای همراه استفاده میکنیم، نوع داده Float را بهکار خواهیم برد.
در نتیجه با توجه به مطالب بالا متوجه شدیم که انتخاب درباره محل استفاده از نوع داده Double وابسته به ایجاد تعادل بین میزان دقت، عملکرد و مصرف حافظه مورد انتظار از اپلیکیشن است.
به عنوان توسعهدهنده نرمافزار، درک صحیح این نیازها برای انتخاب صحیح و تضمین کارآمدی برنامه به صورت بهینه در محیط میزبان ضروری است. محیط میزبان همان محیطی است که برنامه باید در آن کار کند.
اشتباهات رایج زمان استفاده از نوع داده Double
در زمان کار با نوع داده Double چندین اشتباه و سهلانگاری پرتکرار وجود دارند که برنامهنویسها باید نسبت به آنها آگاهی داشته و مراقب گرفتار شدن در آنها باشند. اطلاع از این موارد باعث نجات برنامهها از گرفتار شدن در خطاهایی نامحسوس و تولید نتایج غیر دقیق میشود.
یکی از حوزههایی که کار با اعداد نیازمند رسیدن به دقتهای بالا در محاسبات است، رشته هوش مصنوعی است. فیلم آموزش رایگان اشتغال در حوزه هوش مصنوعی و علوم داده با مروری بر کسب و کارهای مرتبط توسط فرادرس تولید و ارائه شده است. لینک مربوط به این فیلم آموزشی در ادامه نمایش داده شده است.
در این بخش بعضی از این مشکلات را بررسی کرده و راه نجات و دوری از هر کدام را هم آموزش دادهایم.
از دست دادن دقت در برنامه
مسئله از دست دادن دقت برنامه را به صورت کلی در سه قسمت مورد بررسی قرار دادهایم.
- مشکل: توجه کنید که در نهایت حتی نوع داده Double هم نمیتواند همه اعداد اعشاری را نشان دهد. بنابراین، در موارد خاص گرد کردن دادهها میتواند منجر به ظهور خطا در نتایج نهایی محاسبات شود.
- مثال: بر اثر انباشته شدن خطاهای کوچک در حلقههای بزرگ یا در زمان کار با اعداد بسیار بزرگ یا بسیار کوچک ممکن است چنین خطاهایی رخ دهند.
- بهترین روش پیشگیری: با استفاده از بررسی برابری نتایج و عملیات محاسباتی تکراری بروز خطا را پیشبینی کنید. بهکار بردن نوع دادههای BigDecimal یا دادههایی مانند آن را در زبانهای برنامهنویسی مانند جاوا برای انجام محاسبات اعشاری دقیق در نظر بگیرید.
مقایسه برابری
گاهی اوقات در مقایسه بین اعداد بسیار کوچک احتمال بروز خطا وجود دارد. مسئله مقایسه برابری در بین اعداد اعشار مختلف را به صورت کلی در سه قسمت مورد بررسی قرار دادهایم.
- مشکل: مقایسه برابری بین دو عدد اعشار اغلب اوقات میتواند به دلیل خطاهای ناشی از میزان متفاوت دقت مشکلساز شود.
- مثال: کد عملیاتی floatValue1 == floatValue2
شاید مطابق با انتظار کار نکند.
- بهترین روش پیشگیری: برای اجرای عملیات مقایسهای از تکنیک Threshold استفاده کنید که کد آن در زیر آورده شده است.
(abs(floatValue1 - floatValue2) < threshold)
سرریز و ته ریز
در بعضی از زبانهای برنامه نویسی، انواع مختلف داده برای کار با اعداد دارای محدودیت در پشتیبانی از اعداد هستند. مسئله «سرریز» (Overflow) و «تهریز» (Underflow) را به صورت کلی در سه قسمت مورد بررسی قرار دادهایم.
- خطای «سرریز» (Overflow): این خطا زمانی رخ میدهد که عددی از بیشینه قابل نمایش توسط نوع داده خود بزرگتر شود.
- «تهریز» (Underflow): این خطا زمانی رخ میدهد که عدد به سمت صفر نزدیک تر از مقداری شود که توسط نوع دادهای قابل نمایش است.
- بهترین روش پیشگیری: روشهای بررسی مخصوص این شرایط را بهخصوص در حلقهها و محاسبات تکراری یا بازگشتی، طراحی و پیادهسازی کنید.
انتخاب نوع داده غلط نسبت به حوزه اجرای برنامه
بعضی وقتها محاسبات برنامه به گونهای است که نیاز به استفاده از نوع داده خاصی داریم، اما سهل انگاری باعث میتواند باعث انتخاب غلط شود. مسئله انتخاب نوع داده غلط نسبت به حوزه اجرای برنامه را به صورت کلی در دو قسمت مورد بررسی قرار دادهایم.
- مشکل: استفاده کردن از نوع داده Float بهجای Double در زمانی که حساسیت بالایی بر روی دقت محاسبات مورد نیاز است یا حالت برعکس این اتفاق، میتواند منجر به ناکارآمدی یا بی دقتی محاسبات برنامه شود.
- بهترین روش پیشگیری: با در نظر گرفتن میزان دقت مورد نیاز و محدودیتهای عملکرد برنامه، نیازمندیهای اپلیکیشن خود را با دقت ارزیابی کنید.
کج فهمی درباره رفتار خاص زبان برنامه نویسی
بعضی از زبانهای برنامه نویسی، بر روی اعداد محدودیتهای مختلفی قائل هستند. بعضی مثل پایتون فقط از نوع داده Float استفاده میکنند و بعضی مانند زبان Go از دو نام جداگانهای برای دو نوع Float مختلف استفاده میکنند. مسئله کجفهمی درباره رفتار خاص زبان برنامه نویسی را به صورت کلی در دو قسمت مورد بررسی قرار دادهایم.
- مشکل: زبانهای برنامهنویسی مختلف ممکن است اعداد اعشاری را با کمی تفاوت مدیریت کنند. به خصوص با در نظر گرفتن نوع داده پیشفرض و میزان دقت آن.
- بهترین روش پیشگیری: بهترین روش برای جلوگیری از این مشکل پیداکردن شناخت کافی درباره رفتار زبان برنامه نویسی انتخاب شده برای مدیریت محاسبات اعشاری است. همچنین باید نوع داده پیشفرض مورد استفاده توسط زبان مورد نظر را نیز در نظر گرفت.
نادیده گرفتن فاکتورهای محیط میزبان برنامه
برای اجرای برنامههای خود باید به غیر از انتخاب نوع دادههای مناسب با منطق برنامه به سخت افزاری که محل اجرای برنامه هست نیز توجه کنیم. مسئله نادیده گرفتن فاکتورهای محیط میزبان برنامه را به صورت کلی در دو قسمت مورد بررسی قرار دادهایم.
- مشکل: رفتار محاسبات اعشاری بر اساس سختافزاری میزبان برنامه و بهینهسازیهای انجام گرفته توسط کامپایلر میتوانند فرق داشته باشد.
- بهترین روش پیشگیری: اپلیکیشن خود را در شرایط واقعی و محیطهای مختلف اجرای برنامه آزمایش کنید تا از رفتار استوار اپلیکیشن در همه شرایط مطمئن شوید.
در نظر نگرفتن انواع داده جایگزین
در زمان طراحی منطق برنامه، باید انواع مختلف دادهای را در نظر بگیریم که میتوانند در فرایند حل مسئله کمک کنند . مسئله در نظر نگرفتن انواع داده جایگزین را به صورت کلی در دو قسمت مورد بررسی قرار دادهایم.
- مشکل: در بعضی از موراد استفاده از انواع دیگر داده مانند نوع داده fixed-point در محاسبات اقتصادی به جای float یا Double میتواند مناسب باشد.
- بهترین روش پیشگیری: انواع دیگر داده را برای استفاده در برنامه خود بررسی کنید. جایگزین کردن بعضی از نوعهای داده میتواند نیازهای برنامه را بهتر برآورده کند.
کاربردهای ناکارآمد در مجموعه داده های بزرگ
در بعضی از برنامهها با حجم انبوهی از داده سر و کار داریم و در عین حال دقت دادهها تا حد اعشار بسیار بالا یا اندازههای خیلی بزرگ چندان اهمیتی ندارد. مسئله کاربردهای ناکارآمد در مجموعه دادههای بزرگ را به صورت کلی در سه قسمت مورد بررسی قرار دادهایم.
- مشکل: استفاده از نوع داده Double در مجموعه دادههای بزرگ میتواند باعث استفاده ناکارآمد در مصرف حافظه و کاهش توان عملکردی برنامه شود.
- بهترین روش پیشگیری: در کار با مجموعه دادههای بزرگ، مخصوصا وقتی که میزان بالای دقت چندان ضروری نیست، استفاده از نوع داده Float را برای بهینهسازی مصرف حافظه در نظر بگیرید.
داشتن آگاهی درباره این مشکلات بالقوه میتواند باعث دوری کردن از مشکلات رایج مربوط به استفاده از نوع داده Double شود. به همچنین با پایبندی به بهترین شیوهها برای مقابله با این مشکلات میتوانیم از تاثیرگذاری و عملکرد مثبت برنامه مطمئن شویم.
آموزش های پروژه محور برنامه نویسی
در این قسمت از مطلب، چند مورد از فیلمهای آموزشی پروژه محور مربوط به زبانهای مختلف برنامهنویسی فرادرس را معرفی کردهایم. این فیلمهای آموزشی از ابتدا تا انتهای مراحل کدنویسی پروژه را نمایش داده و از سادهترین تکنیکهای برنامهنویسی مانند تعریف متغیر تا تکنیکهای پیچیده را آموزش میدهند. به همین دلیل، گزینه بسیار مناسبی برای تمرین همه آموختههای دانشجویان زبانهای برنامهنویسی هستند.
موضوعات پیشرفته در بررسی عمیق تر نوع داده Double
در این بخش، به صورت عمیقتری، به بررسی مفاهیم پیشرفته مرتبط با نوع داده Double میپردازیم. با این بررسی به درک بهتری از اعداد اعشار و روش استفاده از آنها در برنامهنویسی میرسیم.
قوانین محاسباتی مربوط به اعداد اعشار
داشتن اطلاعات درباره قوانین محاسباتی مربوط به اعداد اعشار مطابق با استانداردهای IEEE باعث رسیدن به درک عمیقتری از انواع دادههای عددی در برنامهنویسی میشود.
- استاندارد IEEE 754: این موارد رایجترین و گستردهترین قواعد درباره کار با اعداد اعشار در کامپیوترها هستند. استاندارد IEEE 754 شکل مربوط به نمایش اعداد اعشار و قوانین مربوط به عملیات محاسباتی با استفاده از این اعداد را تعیین میکند.
- مقادیر خاص: این استاندار مقادیر خاصی مانند «NaN» -این واژه سرنامی از عبارتNot a Number است- مقدار بینهایت مثبت، بینهایت منفی و اعداد نرمال نشده را نیز تعریف کرده است.
- حالتهای مربوط به گرد کردن اعداد: این استاندارد حالتهای مختلف گرد کردن اعداد مانند گرد کردن به سمت نزدیکترین عدد یا گرد کردن به سمت صفر را نیز تعریف کرده است. این حالتهای گرد کردن برای اپلیکیشنهای حساس به دقت، ضروری هستند. موارد تعریف شده در استاندارد IEEE 754 را میتوان به عنوان رایجترین و گستردهترین قواعد درباره کار با اعداد اعشار در کامپیوترها بهشمار آورد.
اشکال توسعه یافته محاسبه دقت
بعضی از زبانهای برنامهنویسی، بسته به کاربرد و هدفشان انواع داده با دقت بیشتری را نیز تدارک دیدهاند.
- Long Double: در زبانهایی مانند C و ++C، نوع داده Long Double، شکل گسترشیافتهای از اعداد اعشار را نشان میدهد. اندازه و دقت این نوع داده بر اساس کامپایلرها و معماریهای مختلف سختافزار میزبان برنامه، پیادهسازی میشوند.
- Quadruple Precision and Beyond: بعضی از سیستمها و زبانهای برنامهنویسی از نوع داده Quadruple Precision یا حتی اشکال نوع دادهای با دقت بالاتر پشتیبانی میکنند. در نوع داده Quadruple Precision برای نگهداری هر مقدار از 128بیت استفاده میشود. این نوع دادهها برای اپلیکیشنهایی با حساسیت بسیار بالا بر روی دقت مانند محاسبات علمی فوق دقیق استفاده میشوند.
کتابخانه های تخصصی کار با درباره اعداد اعشار
به جز زبانهای برنامهنویسی، خود تیمهای توسعه دهنده گوناگون در سراسر دنیا دائما در حال کار بر روی برنامههای مختلف و پیشرفتهاند. بعضی از این تیمها با توجه به نیاز خود کتابخانههای قدرتمندی را برای بدست آوردن دقت بیشتر یا انجام محاسبات ریاضی بر روی اعداد بسیار کوچک ایجاد کردهاند.
- کتابخانههای برای تعیین میزان دقت دلخواه: برای اپلیکیشنهایی که نیاز به دقتی فراتر از آنچه که توسط نوع داده Double فراهم میشوند دارند، میتوان از کتابخانههایی مانند GMP یا MPFR استفاده کرد. این کتابخانهها اجرای عملیات محاسباتی را با میزان دقت دلخواه ممکن میکنند. تنها محدودیت موجود برای این کتابخانهها میزان حافظه سیستم است.
- محاسبات شتاب یافته با استفاده از GPU: با توجه به اینکه GPU-ها برای استفاده از نوع داده Float یا محاسبات Single-Precision بهینهسازی شدهاند، درک روش مدیریت محاسبات اعشاری توسط آنها مفید است. بهخصوص در رشتههایی مانند یادگیری عمیق (Deep Learning) و شبیهسازی عملیاتی با حجم داده انبوه درک روش مدیریت محاسبات اعشاری ضروری نیز میشود.
اثر بهینه سازی های کامپایلر
در این بخش به اثر بهینهسازیهای کامپایلر بر روی استفاده از نوع دادههای اعداد اعشار میپردازیم.
- پرچمهای کامپایلر: بهینهسازیهای مختلف کامپایلرها میتواند به طرز چشمگیری بر محاسبات اعشاری تاثیر بگذارد. این بهینهسازیها گاهی اوقات منجر به بروز نتایج مختلف بر روی سیستمهای گوناگون یا همراه با سطوح بهینهسازی مختلف میشود.
- حفظ تعادل میان پایداری سیستم در مقابل عملکرد: حفظ کردن تعادل میان نتایج ثابت و قابل پیشبینی در مقابل تمایل به بهینهسازی عملکرد، یکی از چالشهای کلیدی در محاسبات اعشاری است.
اعداد اعشاری در محاسبات توزیع شده و موازی
«محاسبات توزیع شده» (Distributed Computing) و «محاسبات موازی» (Parallel Computing) هر کدام بسته به برنامه و سختافزار خود روش برخورد متفاوتی را در مقابل اعداد اعشار در پیش میگیرند.
- سازگاری با سیستمهای مختلف: در محاسبات توزیع شده و موازی، اطمینان حاصل کردن از اینکه محاسبات اعشاری در سیستمها و معماریهای مختلف نتایج ثابتی ارائه دهند خود یکی از چالشهای مهم است.
- استراتژیهای قابلیت تکثیر مجدد: تکنیکهایی مانند استفاده از مقادیر Fixed-Seed در شبیهسازیها یا اجبار به تطابق با استانداردهای IEEE بر روی سیستمهای مختلف، میتواند به حفظ ثبات کمک کند.
جدول مقایسه کلی همه زبان ها
در هر کدام از این زبانهای برنامهنویسی، انتخاب به استفاده بین Double و Float وابسته به نیازهای برنامه مورد توسعه است. بهخصوص با توجه به دقت مورد نیاز و حساسیت برنامه بر استفاده از حافظه باید انتخاب کنیم.
اگر به مرجع راهنمای مختصر و مفیدی نیاز دارید که در حفظ کردن این اطلاعات کلیدی کمک کند، به جدول ارائه شده در پایین توجه کنید.
جمع بندی
در قسمت آخر مطلب بالا، فقط نمایش کوچکی از موضوعات پیشرفته مربوط به نوع داده Double را ارائه کردیم. اما اگر تمایل به داشتن درک جامعتری درباره اعداد اعشاری و مدیریتشان در سیستمهای مدرن و مسائل پیچیده امروزی دارید، بباید به طور کامل در اینباره مطالعه کنید. این نوع از دانش کاربردهای عملی در بخشهای گوناگون دارد. از تحقیقات علمی گرفته تا مدلسازیهای اقتصادی در بازارهای مالی، رفتار صحیح در محاسبات اعشاری، کلید اصلی حل مسائل به طریق کارآمد وخلاقانه است.
در این مطلب از مجله فرادرس، هر چیزی که لازم بود درباره نوع داده Double پوشش دادیم. چه برنامهنویس تازه کاری هستید و چه برنامهنویس حرفهای که به دنبال بهروزرسانی و عمیقتر کردن دانش خود است، تمام اطلاعات مورد نیاز درباره اعداد اعشاری و نوع داده Double را میتوانید در این بخش به سادهترین شکل ممکن پیدا کنید.
source