انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: sajadspeed در 16 بهمن 1401، 12:13 بظ
-
سلام دوستان چند وقته با اضافه شدن یکسری اعداد اعشاری توی چند تا سیستم که از پایتون و JS(NodeJS) استفاده میکرد به مشکلی برخورد کردیم. عملیات ضرب زیر را ببینید:
1.1*3
خوب قاعدتا باید جواب 3.3 باشه ولی پایتون و JS این جواب میدن:
3.3000000000000003
بعد از سرچ متوجه شدم مال استاندارد IEEE-754 برای ممیز شناور هستش، مثلا الان ++C و PHP مشکلی نداشتن و جواب درست میدادن.
حالا بهترین راهحل برای رفع این مشکل چیه؟
میشه کلا اعشار از هزارم دیگه در نظر نگرفت، میشه رندش کرد حتی، ولی موضوع اینه که در این سیستم باید اعداد به شکل دقیق حساب بشن و نمیشه یه راهحل کلی برای برای تمام اعداد پیاده کرد.
در ضمن تا حد زیادی متوجه شدم از جزئیات این مشکل و فرمت binary64 ولی از دوستان کسی بیشتر هم در مورد خود ماهیت این مسئله توضیح داد در کنار راهحل ممنون میشم.
-
همونطور که میدونی این مربوط به روش محاسبه در رایانه میشه. واقعاً هم برای کارهای عادی، دقت ده به توان منفی ۱۷ نیاز نیست و جواب درسته. اگه داریم کار محاسباتی دقیق میکنیم، مثلاً برای فناوریهای نانو، از کتابخونههای مخصوصش استفاده میکنیم که این مسائل توش رعایت شده.
-
خوب ببینید من دقیق نتونستم مطالعه کنم، که کامل به این نحوه محاسبه مسلط بشم. الان پس میفرمایید این باگ بیشتر از 17-^10 نمیشه؟ تعداد ارقام اعشاری که در این سیستم وارد میشه ۶ تا است، پس من تمام اعداد فقط با ۶ رقم ممیز حساب کنم ایرادی پیش نمیاد؟
-
نه. هیچ مشکلی نیست.
-
ممنون که وقت گذاشتید.