آموزش TypeScript - کار با اعداد
Автор: MicroFrontend
Загружено: 2022-05-14
Просмотров: 378
برای درک بهتر این موارد بایستی ابتدا شیوه ذخیره اعداد در کامپیوتر را بررسی نماییم. دو مشخصه مهم Width و Encoding ساختار کلی نوع عدد را تعیین میکند. Width تعداد بیتهایی که برای نمایش عدد لازم است را مشخص میکند که بسیار وابسته به معماری سخت افزاری است و Encoding ساختار این ذخیره سازی را مشخص میکند که معمولا به صورت باینری بدون علامت، مکمل دو یا IEEE754 خواهد بود.
اعداد صحیح در TypeScript
در حالت باینری بدون علامت همه بیتهای در نظر گرفته شده برای عدد رزرو میشد. این روش فقط مناسب اعداد صحیح است و اگر نیاز به ذخیره اعداد علامت دار داشته باشیم بایستی از روش مکمل دو استفاده کنیم در این روش یک بیت برای علامت رزرو میشود و ۱ به معنی منفی و ۰ به معنی مثبت است. اگر عدد مثبت باشد به همان روش باینری ذخیره میشود و اگر منفی باشد مکمل دو آن عدد ذخیره میشود.
چالش زمانی بوجود میآید که نتیجه محاسبات بزرگتر یا کوچکتر از width شود که به آن به ترتیب overflow و underflow میگوییم. برای حل این معضل سه روش معمولا در زبانهای برنامه نویسی به کار گرفته میشود:
روش Wrap Around که در واقع بیت های اضافی حذف میشوند به عنوان مثال اگر نتیجه محاسبه ای ۱۰۰۰۰ شود که بیت آخر اضافی باشد ۱ حذف میشود و عملا عدد صفر میشود. این روش پر استفاده ترین و خطرناک ترین روش است.
روش اشباع یا saturation که در آن به مانند فیزیک یک مقدار به عنوان حداقل و حداکثر تعیین میشود و اگر نتیجه محاسبات از آن ها عبور کند حداقل یا حداکثر به جای آن در نظر گرفته میشود.
روش خطا یا error out مطمن ترین و پرهزینه ترین روش است. در این حالت اگر مقدار از حداکثر یا حداقل فراتر رود خطا اعلام میشود. هزینه این رویکرد در آن است که به ازای هر محاسبه این چک باید انجام شود.
اعداد اعشاری در TypeScript
استاندارد و انکودینگ IEEE 754 برای ذخیره اعداد به صورت ممیز شناور معرفی شده است و در جاوا اسکریپت و به طبع آن در TypeScript از فرمت binary64 این encoding برای همه اعداد استفاده میشود که شامل سه مولفه اصلی یک بیت علامت، ۱۱ بیت نما و ۵۲ بیت مانتیس است. نکته مهمی که باید در مورد این فرمت بخاطر داشت این است که چون یک الگوریتم فشرده سازی نیز هست، هدف ذخیره تا حد امکان عدد برزگتر در فضای محدود است و سعی میکند قسمت اعشار را round کند بر این اساس ممکن است بخشی از دقت بدلیل خطای rounding از بین برود.
در چنین شرایطی اگر نیاز به دقت بالا در محاسبات داشته باشیم بهتر است که قسمت اعشار و قسمت صحیح را جداگانه بهصورت صحیح ذخیره کنیم.
در مورد اعداد صحیح چنانچه عدد بسیار بزرگ شود نیز ممکن است rounding اتفاق بیافتد که با متد Number.isSafeInteger برای چک کردن این مورد استفاده میشود
مقایسه اعداد ممیز شناور
بدلیل خطای rounding، به شکل کلی مقایسه برابری اعداد ممیز شناور یا اعشاری ممکن است ایده خوبی نباشد، راه بهتر این است که بگویم دو مقدار تقریبا یکی هستند. برای این کار بایستی حداکثر خطای ممکن در rounding را که مرتبط به encoding است و آن را machine epsilon میگویند بدانیم و آن را به عنوان حد آستانه تقریب در نظر بگیرم. برای دسترسی به این مقدار در JavaScript از Number.EPSILON استفاده میکنیم که کوچکترین عدد بزرگتر از یک تفسیر میشود. با این اوصاف میتوان از کد زیر برای مقایسه اعداد ممیز شناور استفاده کرد.
00:00 مقدمه
01:36 نوع عدد و ویژگیهای آن در زبانهای برنامه نویسی
02:57 Unsigned Binary
03:30 روش ذخیره سازی مکمل دو
04:01 مدیریت overflow و underflow
05:45 مدیریت دستی overflow و underflow
08:35 اعداد اعشاری در زبان های برنامه نویسی - ieee 754
12:13 مقایسه اعداد اعشاری در typescript
Доступные форматы для скачивания:
Скачать видео mp4
-
Информация по загрузке: