نمایش نتایج 1 تا 5 از 5

نام تاپیک: نحوه ی مقایسه اعداد اعشاری

  1. #1
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    پونک
    سن
    42
    پست
    490

    نحوه ی مقایسه اعداد اعشاری

    سلام،

    تو سی شارپ تایپ double مطابق استاندارد IEEE-754 پیاده سازی شده، پس فقط ۱۵ رقم اعشار دقت داره، به همین دلیل اگه عددی اعشاری با تایپ double بخواد ذخیره بشه به نوعی گردسازی انجام میشه.

    حالا سوال من اینه: اگه تا ۱۵ رقم اعشار دقت داره پس چرا عدد یک صدم دقیق ذخیره نمیشه؟! برای مثال اگه حاصل ۴۵.۱۸ منهای ۴۵.۱۷ رو تو یه متغیر double ذخیره کنیم و تو پنجره local ویژوال استودیو مقادیر رو ببینیم این مقدار رو بجای یک صدم، ۰.۰۰۹۹۹۹۹۹۹۹۹۹۹۹۹۷۸۶۸ نشون میده؟!

    چرا یک صدم داخل متغیر double نمیونه دقیق جا بگیره؟ مگه دقت این تایپ ۱۵ رقم اعشار نیست؟!

    اگه تایپ رو به decimal تبدیل کنیم این مشکل حل میشه! البته باید جلوی اعداد M بزاریم تا کامپایلر خطا نگیره و ۴۵.۱۸ و ۴۵.۱۷ رو double در نظر نگیره.

    اگه اشتباه نکنم دقت اعشار decimal برابر ۲۸ رقمه. خوب double هم ۱۵ رقمه و ۰.۰۱ رو باید بتونه دقیق ذخیره کنه!
    آخرین ویرایش به وسیله elec60 : سه شنبه 02 دی 1393 در 19:52 عصر

  2. #2

    نقل قول: نحوه ی مقایسه اعداد اعشاری


  3. #3
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    پونک
    سن
    42
    پست
    490

    نقل قول: نحوه ی مقایسه اعداد اعشاری

    نقل قول نوشته شده توسط eshaghrahimy مشاهده تاپیک
    این مقاله از آقای وحید نصیری رو قبلا خوندم، ولی مشکلم حل نشده!
    سوالم اینه که چرا ۰.۰۱ نمیتونه دقیق ذخیره بشه؟
    آقای نصیری فقط گفتن عدد ۰.۰۱ نمیتونه دقیق ذخیره بشه ولی علت دقیقشو بیان نکردن

  4. #4

    نقل قول: نحوه ی مقایسه اعداد اعشاری

    سلام
    اینکه اشاره شده دقت تا 15 رقمه فقط به صورت کلی گفته حتی مثلا 45.18 دقیقا به این صورت ممکنه در کامپیوتر ذخیره نشه
    مثلا float که 32 بیتی هست را در نظر بگیرید مطابق استاندارد ieee آخرین عدد که Inf هست
    عدد یکی مانده به آخر به صورت دودویی در کامپیوتر به این صورت ذخیره میشه
    01111111011111111111111111111111
    که معادل اعشاری اون میشه
    340282346638528859811704183484516925440

    حالا عدد دو تا مانده به آخر به صورت دودویی میشه
    01111111011111111111111111111110
    معادل اعشاری:
    340282326356119256160033759537265639424

    حالا اختلاف این دو عدد برابره با :
    20282409603651670423947251286016

    یعنی در عدد های بزرگ رقمهای اعشار هم از بین میره و تقریب به کار می ره
    توی این تاپیک چند منبع در زمینه نمایش اعداد اعشاری به صورت دودویی معرفی شده:
    https://barnamenevis.org/showthread.php?470141

  5. #5
    کاربر دائمی
    تاریخ عضویت
    مرداد 1388
    محل زندگی
    پونک
    سن
    42
    پست
    490

    نقل قول: نحوه ی مقایسه اعداد اعشاری

    علتشو فهمیدم، آقای وحید نصیری علتشو تو سایتش نوشته بود! من ندیده بودم. آقای نصیری درک خیلی عمیقی از دات نت دارن و سایتشون خیلی پرباره.

    نوع double به میزان ۶۴ بیت(۸ بایت) فضا میگیره، عددی مثل ۰.۰۱ اگر قرار باشه با استاندارد IEEE نمایش داده بشه باید قسمت صحیحش صفر بشه که راحت میشه این قسمت رو صفر کرد(همه بیتهای قسمت صحیح برابر صفر) اما قسمت اعشاریش باید با استفاده از توانهای منفی عدد ۲(مبنا) ساخته بشه که با توجه به محدود بودن تعداد بیتها نمیشه دقیق به ۰.۰۱ رسید.

    حالا دقیقا افتاد که چه خبره:)

    نوع decimal هم مبناش بجای ۲ عدد ۱۰ هست و به همین دلیل محاسبات دهدهی راحت تر دو دقیق تره، برای قسمت اعشاری مثال عدد ۰.۰۱ رو میشه به صورت 0.01 (منظور باینری قسمت اعشاری هست) نمایش داد که میشه ۱۰ به توان ۲- ضربدر ۱ به اضافه ۱۰ به توان ۱- ضربدر ۰

    نوع double توسط CPU به طور مستقیم پشتیبانی میشه(مبناش ۲ هست) اما نوع decimal خیر و محاسبات بیشتری برای پیاده سازی میخواد و به همین دلیل تا ۱۰ برابر کندتره(به نقل از کتاب جوزف البهاری)

تاپیک های مشابه

  1. مبتدی: نحوه حذف تعداد اعشار مورد نطر از اعداد اعشاری
    نوشته شده توسط hassan_kahrizy در بخش C#‎‎
    پاسخ: 20
    آخرین پست: سه شنبه 04 اسفند 1394, 12:23 عصر
  2. سوال: مقایسه اعداد اعشاری
    نوشته شده توسط ***BiDaK*** در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 6
    آخرین پست: پنج شنبه 15 تیر 1391, 19:44 عصر
  3. سوال: نحوه وارد کردن اعداد اعشاری
    نوشته شده توسط roshanak_g در بخش C#‎‎
    پاسخ: 1
    آخرین پست: شنبه 05 آذر 1390, 16:53 عصر
  4. مبتدی: نحوه حذف اعداد اعشاری
    نوشته شده توسط Smoke_1110 در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 8
    آخرین پست: یک شنبه 04 اردیبهشت 1390, 20:04 عصر
  5. نحوه ذخیره سازی اعداد اعشاری در کامپیوتر
    نوشته شده توسط amir_es در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 1
    آخرین پست: یک شنبه 09 آبان 1389, 21:07 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •