mathematics in javascript

جاوااسکریپت به روایت آمیرزا: فاجعه‌ی اعداد بزرگ!

هشدار: رویت هلالِ روی ماهِ اعدادِ بزرگ در جاوااسکریپت با چشم غیرمسلح امکان‌پذیر نمی‌باشد!!

اگه شما یه دانشجوی رشته‌ی فنی مهندسی مثل برق یا مکانیک باشید، حتما یکی از دغدغه‌هاتون انجام محاسبات فنی یا به قول فرنگی‌ها Technical Computation هست. از طرفی اگه شما علاوه بر یه مهندس برق یا مکانیک، یه گیکِ علاقه‌مند به برنامه‌نویسی هم باشید، ممکنه دوست داشته باشید به جای کار با Matlab سنت‌شکنی کنید و با یه چیز شادتری پروژه‌هاتون رو انجام بدید. مثل چی؟ مثل جاوااسکریپت!

البته من برای پروژه‌های محاسبات فنی پیچیده همون متلب یا امثال اون مثل جولیا و یا پایتانِ تجهیزشده به NumPy رو پیشنهاد میکنم، چون با قدرت بالایی که دارند هم کار شما رو سریع پیش میبرن، هم حس قدرت تو حل مسئله رو بهتون میدن. در هر صورت، انتخاب خودم برای کارهای ساده‌تر چیزی نیست جز جاوااسکریپتِ عزیز و دوست‌داشتنی. چرا؟ چون خصوصیاتی داره که تو هیچ جای دیگه‌ای نمیتونید پیدا کنید. چیا؟ اینا:

  • جاوااسکریپت امکان اجرا شدن تو هر سیستم و هر جایی رو داره، بدون هیچ پیش‌نیازی! فقط کافیه یه مرورگر دم دستتون باشه، که این روزا تو هر کامپیوتر و موبایلی وجود داره!
  • جاوااسکریپت سبک، ساده و سریعه!
  • وقتی با جاوااسکریپت تحت مرورگر کار می‌کنید، این امکان رو دارید تا از دریایی از امکانات بصری که این محیط براتون فراهم میکنه استفاده کنید، فی‌المثل می‌تونید با HTML5 برای پروژه‌ه‌تون یه رابط کاربری مدرن، زیبا و سَبُک طراحی کنید و همه رو تحت تاثر قرار بدید. در نتیجه ورودی‌ها رو راحت دریافت می‌کنید و خروجی‌ها رو به زیبایی و در قالب نمودارهای رنگاوارنگ نمایش میدید.
  • اگه جاوااسکریپت رو با Node.JS تجهیز کنید، قابلیت کار با پایگاه داده‌هایی مثل MongoDB رو خواهید داشت. یا مثلا می‌تونید از Datastoreهایی مثل Redis استفاده کنید. چی ازین بهتر؟ (البته تو این حالت دیگه فقط داشتن یه مرورگر براتون کافی نیست! و به Node.JS هم احتیاج پیدا خواهید کرد)

در یک کلام، جاوااسکریپت از هر انگشتش هزارتا هنر میریزه!

بریم سراغ بحث خودمون، جاوااسکریپت و محاسبات فنی! جاوااسکریپت یه کتابخونه‌ی ساده، صمیمی و فوق‌العاده سبک برای کار با توابع ریاضی داره به اسم math.js که وقتی کارائیش رو ببنید شگفت‌زده میشید. قبل از معرفی باید تاکید کنم که math.js رو با کتابخونه‌ی توکار جاوااسکریپت برای ریاضیات که Math هست، اشتباه نگیرید. کتابخونه‌ی Math به صورت ذاتی تو جاوااسکریپت وجود داره، اما math.js رو باید به فایلِ پروژه‌تون ضمیمه کنید تا بتونید ازش بهره ببرید. می‌تونید وبسایت math.js رو از آدرس http://mathjs.org چک کنید. همچنین می‌تونید فهرست امکانات math.js رو تو صفحه مستنداتش مشاهده کنید. و صد البته می‌تونید مثال‌هایی رو هم متناسب با هر کدوم از امکانات math.js تو آدرس زیر مشاهده کنید:

http://mathjs.org/examples/index.html

خلاصه هرچی که درمورد math.js لازم داشته باشیم، مختصر و مفید تو وبسایتش در اختیارمونه، اون هم با مثال. بسیار هم عالی!

راستی تا یادم نرفته، یه چیز جالب هم راجع به math.js بگم. این کتابخونه یه امکان جالب داره که بهمون اجازه میده واحدهای مختلف رو به‌همدیگه تبدیل کنیم. مثل سانتی‌متر به اینچ، Bar به psi و قس علی هذا!! تبدیل واحدهای زیادی رو هم حمایت میکنه مثل تبدیل واحدهای طول، سطح، حجم، فشار، انرژی، جرم، نیرو و امثال این‌ها.

امیدوارم تا به اینجای کار به math.js علاقه‌مند شده باشید. فقط یک نکته‌ی خیلی خیلی مهم و خطرناک باقی می‌مونه، اون هم اینکه:

جاوااسکریپت وقتی با اعداد بزرگ مواجه میشه، تبدیل میشه به یه خُل و چِل تموم عیار! حواستون باشه که با جاوااسکریپتِ خالص محاسبات خودتون رو به فنا ندید!!

اگه منظورم رو متوجه نشدید، به مثال‌های زیر توجه کنید تا عمق فاجعه رو درک کنید:

Math.pow(2, 53)         // answer: 9007199254740992
Math.pow(2, 53) + 1    // answer: 9007199254740992
Math.pow(2, 53) == Math.pow(2, 53) + 1        // answer: True
Math.pow(2, 53) + 3 - Math.pow(2, 53) – ۳     // answer: 1
Math.pow(2, 53) + 5 - Math.pow(2, 53) – ۵     // answer: -1

جا داره که بگیم: جاوااسکریپت جان، وات دِ فاز؟ واقعا فازت چیه؟

در هر صورت، math.js امکاناتی برای کار با اعداد بزرگ یا به قول فرنگی‌ها Bignumbers داره، با بهره بردن از قدرت math.js از شر مشکلاتی که در بالا بهشون اشاره شد هم خلاص میشید.

پس نتیجه‌گیری می‌کنم، به نظر من برای انجام محاسبات فنی از نوع ساده‌ش، جاوااسکریپت عالیه! برای کارهای متوسط محاسباتی، جاوااسکریپت رو حتما به ادوات لازمه مثل math.js تجهیز کنید تا وا نده و ناامیدتون نکنه! اما برای کارهای سنگین محاسباتی همچنان Matlab، Julia و یا پایتان تجهیزشده به NumPy رو بهتون توصیه میکنم.

روزهای شادی داشته باشید.

قربان شما،

آمیرزا

آمیرزا

یه برق‌خونده‌ی علاقه‌مند به برنامه‌نویسی

8 دیدگاه برای “جاوااسکریپت به روایت آمیرزا: فاجعه‌ی اعداد بزرگ!

  1. یه مشکل دیگه ای که وجود داره فرض کنید با استفاده از کتابخانه math.js که توضیح دادی دستورات زیر رو وارد کنیم
    var z = math.eval(‘7 inch to cm’)
    console.log(z);
    با این دستورات میشه عدد ۷ اینچ را به cm به دست آورد
    اما مشکلی که وجود داره عدد مورد نظر ۱۷٫۷۸ هستش در صورتی که خروجی که ما می گیریم عدد ۱۷٫۷۷۹۹۹۹۹۹۹۹۹۹۹۹۹ است
    حتی خارج از این کتابخونه بازم جاوااسکریپت همچین اشتباهاتی رو داره که من نتونستم حلش کنم فقط اونا رو گرد می کنم که به عدد مورد نظر برسم. من فک کردم با این کتابخونه این مشکلات هم حل میشه که دیدم نه بازم وجود داره….

    ___________
    خط هفتم از پایین غلط املایی دارد. (msth.js نوشته اید.)

    1. ممنون از اینکه غلط املایی رو گوشزد کردی حمید جان، تصحیح شد.
      اما درباره‌ی این موردی که گفتی، این مشکل از کتابخونه‌ی math.js نیست، بلکه مشکل ذاتی خود جاوااسکریپته. برای حل این مشکل می‌تونیم از کتابخونه‌ی bignumber.js استفاده کنیم. البته خود math.js هم متدی داره به اسم bignumber که میتونیم از اون هم استفاده کنیم. البته استفاده از این کتابخونه‌ها دستورات مربوط به عملیاتهای ریاضی رو یخورده طولانی میکنن. اما چاره چیه؟ جاوااسکریپت فعلا تو این زمینه خل و چل بازی درمیاره!!!
      برای دیدن مثال‌های bignumber با math.js میتونی به لینک زیر مراجعه کنی:
      BigNumbers

      1. آره دیکه مشکل جاوااسکریپته البته جاهای دیکه مثلا تو sql هم مشکل مشابه اینو مواجه شدم که من فک کردم با این کتابخونه برطرف می شه که نشد. حالا با این BigNumbers کار می کنم ایشالا مشکلو رفع کنه 😉

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *