বিষয় 71 / 91· সফটওয়্যার প্রকৌশল ও ডিজিটাল ডেলিভারি

মুদ্রা-নিরাপদ ব্যয় সংকলন

অনেক অর্থের আইটেম — মাসিক চালান, অবস্থান-প্রতি ব্যয়, বহু-বছর বাজেট প্রভাব সংখ্যা — সাধারণ বাইনারি ভাসমান-বিন্দু সংখ্যা (f64) দিয়ে যোগ করলে ক্ষুদ্র উপস্থাপনা ত্রুটি জমে, কারণ বেশিরভাগ দশমিক ভগ্নাংশ (যেমন $১,২৩৪.৫৬) বাইনারি ভাসমান-বিন্দুতে নিখুঁতভাবে প্রকাশ করা যায় না। প্রতিটি ত্রুটি ক্ষুদ্র, কিন্তু বহু বছর জুড়ে শত বা হাজার আইটেম যোগকারী বড় মডেল এক সেন্টের ভগ্নাংশ বিচ্যুত হতে পারে — এবং বিচ্যুতি যোগের ক্রমের ওপর নির্ভর করে, ফলে পুনরুৎপাদনযোগ্য নয়। নিখুঁত দশমিক গণিত (বা পূর্ণসংখ্যা ক্ষুদ্রতম একক) দিয়ে করা মুদ্রা সংকলন নিখুঁতভাবে যোগ হয়, হিসাবরক্ষণ ব্যবস্থা ও দ্বি-প্রবিষ্টি বুককিপিং যেভাবে সেন্ট পর্যন্ত মিলতে হয় তার সাথে সামঞ্জস্যপূর্ণ।

কেন এটি গুরুত্বপূর্ণ

এটি সুনথিবদ্ধ ও মৌলিক সফটওয়্যার বাগের ধরন: Goldberg-এর ১৯৯১ সালের 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 × 12 = $১৪,৮১৪.৭২ হুবহু, বনাম IEEE-754 দ্বিগুণ নির্ভুলতায় f64 ধ্রুবক 1234.56 বারো বার যোগ করা, যা যোগের ক্রমের ওপর নির্ভর করে এক সেন্টের ভগ্নাংশ বিচ্যুত হতে পারে — একটি বাস্তব ও নথিবদ্ধ বাগের ধরন, নিখুঁত দশমিক Money গণিতে তৈরি মডেলের জন্য সমস্যা নয়।

এখন সেই $১৪,৮১৪.৭২ মোটে মানক ৫% বাজেট প্রভাব কন্টিনজেন্সি (গুণক ১.০৫) প্রয়োগ করুন: $14,814.72 × 1.05 = $১৫,৫৫৫.৪৫৬ — তিন দশমিক স্থান, কারণ গুণ নিখুঁত এবং স্বয়ংক্রিয়ভাবে মুদ্রার দুই স্থানে গোলাকৃত হয় না। ব্যাংকারের গোলাকরণ (half-even) দিয়ে স্পষ্টভাবে ২ স্থানে গোলাকরণ করলে হুবহু $১৫,৫৫৫.৪৬ পাওয়া যায়।

সফটওয়্যার প্রকৌশলের সাথে সংযোগ

এটি "আর্থিক সফটওয়্যার Decimal ব্যবহার করে, float নয়" নীতির সরাসরি মৌলিক শিক্ষা — এই ভান্ডারের মালিকানার মোট ব্যয় ও বাজেট প্রভাব বিশ্লেষণ মডিউলের সাথে স্পষ্টভাবে সংযুক্ত, যে দুটি বর্তমানে সাধারণ ভাসমান-বিন্দু ব্যয় সংকলন করে। সঠিকতার যুক্তি সেই মডেলগুলো অবিলম্বে স্থানান্তরের দাবি করে না; বরং এটি ঠিক কখন একটি সিস্টেমকে সেন্ট পর্যন্ত মিলতে হবে এবং তাই তার অর্থ গণিতের জন্য বাইনারি ভাসমান-বিন্দু ব্যবহার করা চলবে না তা চিহ্নিত করে। সেন্ট না হারিয়ে মোট ভাগ করার (যোগের বদলে) যুগল সমস্যার জন্য নিখুঁত-সেন্ট ব্যয় বণ্টন দেখুন।

ঝুঁকিপূর্ণ দিক

  • শৃঙ্খলের মাঝখানে float-এ রূপান্তর: গণনার মাঝে একটি আর্থিক মান ভাসমান-বিন্দু সংখ্যা হিসেবে বের করা (কিছু Money লাইব্রেরি এই রূপান্তর পদ্ধতির নাম স্পষ্ট সতর্কবার্তা হিসেবে "lossy" রাখে) সেই বিন্দুর পরের প্রতিটি গণনার নির্ভুলতা নিশ্চয়তা নীরবে ছেড়ে দেয়।
  • "Decimal এত ধীর যে পাত্তা দেওয়ার মতো নয়": নিখুঁত দশমিক গণিতকে অপ্রয়োজনীয় বোঝা হিসেবে বাতিল করা, অথচ আর্থিক প্রতিবেদনে চাই সঠিকতা ও নিরীক্ষণযোগ্যতা, কাঁচা থ্রুপুট নয়।
  • গোলাকার নিয়ম না বলে শতাংশ কন্টিনজেন্সি প্রয়োগ: half-up বনাম half-even (ব্যাংকারের গোলাকরণ) শেষ সেন্ট বদলাতে পারে; গোলাকরণ প্রথা নিজেই একটি উল্লিখিত, নিরীক্ষণযোগ্য পছন্দ হতে হবে — কন্টিনজেন্সি সমন্বয় ও আশাবাদ পক্ষপাত সম্পর্কে HM Treasury Green Book নির্দেশনার জন্য ব্যয়-সুবিধা বিশ্লেষণ দেখুন, এই গোলাকরণ ধাপ যে ধরনের সংখ্যায় প্রযোজ্য।

উৎস