موضوع 71 از 91· سافٹ ویئر انجینئرنگ اور ڈیجیٹل ڈیلیوری

کرنسی کے لحاظ سے محفوظ لاگت کا مجموعہ

بہت سی مالی مدوں — ماہانہ بل، فی مقام لاگت، کثیر سالہ بجٹ اثر کے اعداد — کو عام بائنری فلوٹنگ پوائنٹ اعداد (f64) سے جمع کرنا چھوٹی چھوٹی نمائندگی کی غلطیاں جمع کرتا ہے، کیونکہ زیادہ تر اعشاری کسور (جیسے $1,234.56) بائنری فلوٹنگ پوائنٹ میں بالکل درست طور پر ظاہر نہیں ہو سکتے۔ ہر غلطی چھوٹی ہوتی ہے، مگر ایک بڑا ماڈل جو برسوں میں سینکڑوں یا ہزاروں مدیں جمع کرتا ہے ایک سینٹ کے کسی حصے سے ہٹ سکتا ہے — اور یہ انحراف جمع کرنے کی ترتیب پر منحصر ہے، اس لیے قابلِ تکرار نہیں۔ درست اعشاری ریاضی (یا صحیح عدد کی سب سے چھوٹی اکائی) سے کیا گیا کرنسی کا مجموعہ بالکل درست جمع ہوتا ہے، اس کے مطابق کہ حسابی نظام اور دوہری اندراج کی کھاتہ داری کو سینٹ تک ملنا ہوتا ہے۔

یہ کیوں اہم ہے

یہ سافٹ ویئر کی خرابی کی ایک اچھی طرح دستاویز شدہ اور بنیادی قسم ہے: Goldberg کا 1991 کا ACM Computing Surveys کا مضمون "What Every Computer Scientist Should Know About Floating-Point Arithmetic" اس کا معیاری حوالہ ہے کہ بائنری فلوٹنگ پوائنٹ زیادہ تر اعشاری رقوم کو بالکل درست طور پر کیوں ظاہر نہیں کر سکتا اور ان میں سے بہت سی کو جمع کرنے سے غلطی کیوں بڑھتی ہے۔ NHS کی صحت کی معاشیات اور مالیاتی ماڈل باقاعدگی سے کئی سال اور کئی لاگت کی اقسام جمع کرتے ہیں — ملکیت کی کل قیمت اور بجٹ اثر کا تجزیہ دونوں برسوں میں بہت سی f64 لاگت کی مدیں جمع کرتے ہیں۔ جب کسی ماڈل کو سینٹ تک ملنا ہو — ہاتھ سے کل نکالنے والے آڈٹ کو بالکل وہی عدد ملنا چاہیے — تو ریاضی خود درست اعشاری ہونی چاہیے، فلوٹنگ پوائنٹ نہیں۔

ریاضی

سادہ مجموعہ:                   کل = Σ f64(مد_i)        — ترتیب پر منحصر انحراف
کرنسی کے لحاظ سے محفوظ مجموعہ: کل = Σ Decimal(مد_i)    — درست، قابلِ تکرار

فیصد ایڈجسٹمنٹ لاگو کرنا (مثلاً ہنگامی ذخیرہ):
  ایڈجسٹ شدہ = کل × ضرب کنندہ        — درست Decimal نتیجہ، کرنسی کی سب سے چھوٹی
                                        اکائی کے قوت نما سے زیادہ اعشاری مقامات ہو سکتے ہیں
  گول شدہ = گول(ایڈجسٹ شدہ, کرنسی_قوت_نما, گول_کرنے_کا_اصول)
                                      — گول کرنے کا اصول (half-up بمقابلہ
                                        half-even/بینکار کا گول کرنا) صراحت
                                        سے بتانا لازم ہے

دو مرحلوں کے نظم پر غور کریں: ایک درست Decimal کو ضرب کنندہ سے ضرب دینے پر کرنسی کے حقیقی استعمال سے زیادہ اعشاری مقامات آ سکتے ہیں (مثلاً دو مقام والے عدد کو دو مقام والے ضرب کنندہ سے ضرب دینے پر تین اعشاری مقامات) — وہ درمیانی درستگی خود بخود نہیں کٹتی؛ صرف ایک واضح گول کرنے کا مرحلہ، بتائے گئے گول کرنے کے اصول کے ساتھ، اسے کرنسی کی حقیقی سب سے چھوٹی اکائی کے قوت نما تک لاتا ہے۔

حل شدہ مثال

بارہ یکساں ماہانہ بل، ہر ایک $1,234.56، درست اعشاری ریاضی سے جمع کیے گئے: $1,234.56 × 12 = $14,814.72 بالکل، بمقابلہ IEEE-754 دوہری درستگی میں f64 مستقل 1234.56 کو بارہ بار جمع کرنا، جو جمع کرنے کی ترتیب کے لحاظ سے سینٹ کے کسی حصے سے ہٹ سکتا ہے — ایک حقیقی اور دستاویز شدہ خرابی کی قسم، درست اعشاری Money ریاضی پر بنے ماڈل کے لیے مسئلہ نہیں۔

اب اس $14,814.72 کل پر معیاری 5% بجٹ اثر کا ہنگامی ذخیرہ (ضرب کنندہ 1.05) لاگو کریں: $14,814.72 × 1.05 = $15,555.456 — تین اعشاری مقامات، کیونکہ ضرب درست ہے اور خود بخود کرنسی کے دو مقامات تک گول نہیں ہوتی۔ بینکار کے گول کرنے (half-even) سے واضح طور پر 2 مقامات تک گول کرنے پر بالکل $15,555.46 ملتا ہے۔

سافٹ ویئر انجینئرنگ سے تعلق

یہ "مالیاتی سافٹ ویئر Decimal استعمال کرتا ہے، float نہیں" اصول کے پیچھے براہِ راست بنیادی سبق ہے — اس ذخیرے کے ملکیت کی کل قیمت اور بجٹ اثر کا تجزیہ ماڈیولز سے واضح طور پر جڑا ہوا، جو فی الحال عام فلوٹنگ پوائنٹ لاگت جمع کرتے ہیں۔ درستی کی دلیل ان ماڈلز کی فوری منتقلی کا تقاضا نہیں کرتی؛ یہ ٹھیک بتاتی ہے کہ کب کسی نظام کو سینٹ تک ملنا چاہیے اور اس لیے اپنی رقم کی ریاضی کے لیے بائنری فلوٹنگ پوائنٹ استعمال نہیں کرنا چاہیے۔ ایک کل کو (جمع کرنے کے بجائے) ایک سینٹ ضائع کیے بغیر تقسیم کرنے کے ساتھی مسئلے کے لیے سینٹ تک درست لاگت کی تقسیم دیکھیں۔

عام غلطیاں

  • زنجیر کے بیچ میں float میں تبدیلی: حساب کے بیچ کسی مالی قدر کو فلوٹنگ پوائنٹ عدد کے طور پر نکالنا (کچھ Money لائبریریاں اس تبدیلی کے طریقے کا نام ہی واضح تنبیہ کے طور پر "lossy" رکھتی ہیں) اس نقطے کے بعد ہر حساب کے لیے درستی کی ضمانت خاموشی سے چھوڑ دیتا ہے۔
  • "Decimal اتنا سست ہے کہ پروا کی جائے": درست اعشاری ریاضی کو غیر ضروری بوجھ کہہ کر رد کرنا، جبکہ مالی رپورٹنگ کو درستی اور آڈٹ پذیری چاہیے، خام تھرو پٹ نہیں۔
  • گول کرنے کا اصول بتائے بغیر ہنگامی ذخیرے کا فیصد لاگو کرنا: half-up بمقابلہ half-even (بینکار کا گول کرنا) آخری سینٹ بدل سکتا ہے؛ گول کرنے کا اصول خود ایک بیان کردہ، قابلِ آڈٹ انتخاب ہونا چاہیے — ہنگامی ایڈجسٹمنٹ اور خوش فہمی کے تعصب پر HM Treasury Green Book کی رہنمائی کے لیے قیمت-فائدہ کا تجزیہ دیکھیں، ایسے اعداد جن پر گول کرنے کا یہ مرحلہ لاگو ہوتا ہے۔

ذرائع