paint-brush
স্মার্ট চুক্তিতে পূর্ণসংখ্যা বিভাগের ত্রুটি কীভাবে বাইপাস করবেনদ্বারা@dansierrasam79
1,813 পড়া
1,813 পড়া

স্মার্ট চুক্তিতে পূর্ণসংখ্যা বিভাগের ত্রুটি কীভাবে বাইপাস করবেন

দ্বারা Daniel Chakraborty6m2023/02/20
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

আপনি যখন পাইথন বা জাভা শেখা শুরু করবেন, আপনি ফ্লোট ডেটা টাইপ ব্যবহার করবেন। সলিডিটিতে, আপনি স্বাক্ষরিত বা স্বাক্ষরবিহীন পূর্ণসংখ্যা প্রকারের সংখ্যা ব্যবহার করবেন। আপনি যে ফলাফলটি পাবেন তা একই হবে না, যেহেতু সলিডিটি ফ্লোটডেটা টাইপ সমর্থন করে না।
featured image - স্মার্ট চুক্তিতে পূর্ণসংখ্যা বিভাগের ত্রুটি কীভাবে বাইপাস করবেন
Daniel Chakraborty HackerNoon profile picture
0-item
1-item
2-item

আমরা সবাই স্কুলে ভাসমান পয়েন্ট সংখ্যা সম্পর্কে শিখেছি। পূর্ণসংখ্যার বিপরীতে যার কোন দশমিক বিন্দু নেই।


পাঁচ নম্বরটি একটি পূর্ণসংখ্যা এবং 5.43 একটি ফ্লোটিং পয়েন্ট সংখ্যা তা জানার জন্য একজনকে গণিতের হুইজ হওয়ার দরকার নেই। স্পষ্টতই, আমরা সবাই দশমিক বিন্দুর সাথে পরিচিত যেটি দুটির মধ্যে পার্থক্যের একটি স্পষ্ট বিন্দু।


অবশ্যই, এটা কোন আশ্চর্যের কিছু নয় যে ফ্লোটগুলি প্রোগ্রামিং ভাষায় ব্যবহার করা হয় এবং এমনকি একটি স্বতন্ত্র আদিম ডেটা টাইপ হিসাবে শ্রেণীবদ্ধ করা হয় কারণ এটি দৈনিক গণনার জন্য কতটা প্রয়োজনীয়।

প্রোগ্রামিং ল্যাঙ্গুয়েজে ফ্লোটিং পয়েন্ট নম্বর ব্যবহার করা

আপনি যখন পাইথন বা জাভা শেখা শুরু করবেন, আপনি ফ্লোট ডেটা টাইপ ব্যবহার করবেন। বিশেষ করে, যখন আপনি দুটি ফ্লোটিং পয়েন্ট সংখ্যার মধ্যে বিভাজন অপারেশনটি পরিচালনা করেন।


পাইথনে, এমনকি যদি আপনাকে একটি ফ্লোটিং পয়েন্ট নম্বর ঘোষণা করতে না হয়, তবে এই দুটি সংখ্যাকে ভাগ করার ফলে একই ডেটা টাইপের সংখ্যা হতে পারে, যেমনটি নীচে দেখানো হয়েছে:


দুটি ফ্লোটিং পয়েন্ট সংখ্যাকে ভাগ করার জন্য পাইথন প্রোগ্রাম


আমরা জাভাতেও একই ফলাফল আনতে পারি, এমনকি যদি আমাদের ব্যবহৃত সমস্ত ভেরিয়েবলের জন্য 'ফ্লোট' আদিম ডেটা টাইপ স্পষ্টভাবে ঘোষণা করতে হয়।


জাভা প্রোগ্রাম দুটি ভাসমান পয়েন্ট সংখ্যা বিভক্ত করতে


যেমন কেউ বলতে পারে, এই ধরণের গণনা অনেকগুলি অ্যাপ্লিকেশনের জন্য প্রয়োজনীয়, এবং ঠিক এই কারণেই ফ্লোটিং পয়েন্ট নম্বর সহ অপারেশনগুলি এই দুটি প্রোগ্রামিং ভাষাতেই একটি বৈশিষ্ট্য হিসাবে উপলব্ধ।


বেশ ভিন্নভাবে, আপনি যদি সলিডিটি শিখছেন, আপনার লক্ষ্য করা উচিত যে এতে ফ্লোটিং পয়েন্ট নম্বর ডেটা টাইপ অন্তর্ভুক্ত নয়।

কীভাবে সলিডিটি ফ্লোটিং পয়েন্ট নম্বর ছাড়াই লেনদেন সম্পাদন করে

পরিবর্তে, আপনি যদি সলিডিটিতে কোনো কোড লিখে থাকেন, তাহলে আপনি স্বাক্ষরিত বা স্বাক্ষরবিহীন পূর্ণসংখ্যা প্রকারের সংখ্যা ব্যবহার করবেন।


সুতরাং, আপনি যদি একই গণনা করতে চান - পাঁচটি ভাগ করে দুই - যেমনটি আগের বিভাগে দেখানো হয়েছে, একটি স্মার্ট চুক্তির অংশ হিসাবে এটি দেখতে কেমন হবে তা এখানে:


পূর্ণসংখ্যা বিভাগ ত্রুটি - সলিডিটিতে স্মার্ট চুক্তি


যাইহোক, আপনি যে ফলাফল পাবেন তা একই হবে না, যেহেতু সলিডিটি ফ্লোট ডেটা টাইপ সমর্থন করে না। অন্তত, এখনও না.


getResult ফাংশন


বিশেষত, দৃঢ়তা ফলাফলকে শূন্যের দিকে বৃত্তাকার করবে। যা, এই ক্ষেত্রে, এবং উপরে দেখানো হিসাবে, দুই এর একটি মান হবে। উভয় সংখ্যার মডিউল অপারেশন হিসাবে এটি মনে করুন।


সাধারণ পরিস্থিতিতে, এটি খুব বেশি গুরুত্বপূর্ণ নয়, এমন সময় আছে যখন ফলাফল গণনায় ত্রুটির কারণ হতে পারে। যে কারণে যতটা সম্ভব ডিভিশন অপারেশন এড়ানো বা স্থগিত করার সুপারিশ করা হয়।

পূর্ণসংখ্যা বিভাগ ত্রুটি আপনার প্রথম চেহারা

এমনকি যদি স্কুলে BODMAS নিয়মে সমস্ত গণিতের ছাত্রদের গুণের আগে ভাগ গণনা করতে হয়, তবে যদি আপনাকে সলিডিটিতে পূর্ণসংখ্যা বিভাজন করতে হয় তবে এটি সুপারিশ করা হয় না।


আসুন জেনে নেওয়া যাক কেন, এই সহজ উদাহরণ দিয়ে, যে তিনটি সংখ্যার সাথে গুণ ও ভাগ করে:


তিনটি সংখ্যাকে গুণ ও ভাগ করুন - সলিডিটিতে স্মার্ট চুক্তি


স্মার্ট কন্ট্রাক্ট স্থাপন করার সময় আপনি যদি এক, তিন এবং পাঁচ নম্বরটি প্রবেশ করেন, তাহলে আপনার getResult এবং getResult2 ফাংশনের জন্য একই মান পাওয়া উচিত, তাই না?


আপনি যদি একটি সাধারণ ক্যালকুলেটর ব্যবহার করেন, তাহলে আপনার 1.666 এর একটি ফ্লোট মান পাওয়া উচিত, যা সলিডিটিতে একটিতে অনুবাদ করে, ফ্লোট মানগুলির অনুপস্থিতির জন্য ধন্যবাদ৷


দুর্ভাগ্যবশত, এটি ঘটে না, যখন আপনি getResult এবং getResult2 ফাংশনগুলির ফলাফল পরীক্ষা করেন, যেমনটি নীচে দেখানো হয়েছে:


getResult এবং getResult2 ফলাফল


যদি আমরা প্রথমে বিভাগটি সম্পাদন করি, আমরা শূন্যের চূড়ান্ত ফলাফল পাই। একটির প্রত্যাশিত মানের বিপরীতে, যখন আপনি getResult ফাংশনে সেই অপারেশনটিকে শেষ পর্যন্ত স্থগিত করেন।


আপনি বলতে পারেন, এমনকি যদি আমরা ফ্লোট মানের অনুপস্থিতির অনুমান করে এই মানটি গণনা করেছি, তবুও একটি ত্রুটি রয়েছে যা ক্রপ আপ হয় যা নির্ভুলতার ক্ষতির কারণ হতে পারে। যা, ঘুরে, একটি অর্থনৈতিক ক্ষতিতে অনুবাদ করতে পারে যা সহজেই বাইপাস করা যায়।


সুতরাং, আমরা কিভাবে পূর্ণসংখ্যা বিভাজন ত্রুটি প্রতিরোধ করব? আরও গুরুত্বপূর্ণ, আমরা কীভাবে আমাদের গণনার জন্য নির্ভুলতা বাড়াব? আসুন এটি করার তিনটি সবচেয়ে সাধারণ উপায় খুঁজে বের করা যাক।

পূর্ণসংখ্যা বিভাগ ত্রুটি প্রতিরোধ করার 3 উপায়

প্রদত্ত যে এই ত্রুটিটি প্রতিরোধ করার জন্য অনেকগুলি পন্থা রয়েছে, আসুন সবচেয়ে সহজ সমাধান দিয়ে শুরু করি এবং এটিকে একদিনে কল করার আগে আরও কয়েকটির দিকে তাকাই৷


পদ্ধতি #1: একটি গুণক ব্যবহার করুন

এখন, ডিভিশন অপারেশনটি শেষ করার পাশাপাশি, আপনি ত্রুটি বা অসম্পূর্ণ মান দিয়ে শেষ করবেন না তা নিশ্চিত করার একটি উপায় হল একটি গুণক ব্যবহার করা। নীচের উদাহরণে, আমরা আগে ব্যবহৃত একই তিনটি সংখ্যার সাথে 100 এর গুণক ব্যবহার করব।


একটি গুণক ব্যবহার করা - সলিডিটিতে স্মার্ট চুক্তি


এখন, যখন আপনি নিম্নলিখিত কোডের সাথে চুক্তি স্থাপন করেন এবং উভয় ফাংশন কল করেন, তখন এটি আউটপুট:

একটি গুণক ব্যবহার করে - getResult এবং getResult2 মান


যেহেতু কাঙ্খিত আউটপুট হল 1.666 বা 166/100, আমরা দেখতে পাচ্ছি যে getResult2 মান আমাদের প্রয়োজনীয় নির্ভুলতা প্রদান করে যখন গুণক তিনটি সংখ্যার সাথে একত্রে কাজ করে। অবশ্যই, যদি আপনি getResult ফাংশনের মতো গুণক ব্যবহার না করেন তবে আপনি 1 পাবেন।


যেখানে আপনি সলিডিটি ব্যবহার করার সময় ডিফল্টরূপে প্রত্যাশিত ফলাফল থেকে 0.666 ছেঁটে ফেলা হয়। সুতরাং, এই মানটি পুনরুদ্ধার করতে, আপনাকে যা করতে হবে তা হল গুণক দ্বারা ফলাফলকে ভাগ করুন।


আপনি হয়তো জানেন, সলিডিটি শূন্যের দিকে চলে যায় যখন এটি স্বাক্ষরিত এবং স্বাক্ষরবিহীন উভয় পূর্ণসংখ্যার ক্ষেত্রে রাউন্ডিং অফের ক্ষেত্রে আসে, তাই এই ফিক্সটি স্বাক্ষরিত পূর্ণসংখ্যার ক্ষেত্রেও কাজ করে, একবার আপনি আর্গুমেন্ট বিয়োগ সহ নীচের কোডটি স্থাপন এবং চালান। , তিন এবং পাঁচ:


স্বাক্ষরিত পূর্ণসংখ্যার জন্য একটি গুণক ব্যবহার করা - সলিডিটিতে স্মার্ট চুক্তি


যখন এটি স্বাক্ষরিত পূর্ণসংখ্যার জন্য ফাংশন দ্বারা উত্পন্ন মানগুলির কথা আসে, তখন সেগুলি এখানে রয়েছে:


স্বাক্ষরিত পূর্ণসংখ্যার জন্য একটি গুণক ব্যবহার করা - সলিডিটিতে স্মার্ট চুক্তি


স্পষ্টতই, আমরা একটি গুণক ব্যবহার করে স্বাক্ষরিত পূর্ণসংখ্যার জন্যও নির্ভুলতা বজায় রাখতে সক্ষম। যদিও, স্বাক্ষরিত পূর্ণসংখ্যাগুলিকে বৃত্তাকার করার একটি সুনির্দিষ্ট উপায় আছে যা আমরা পরবর্তীতে দেখব।


পদ্ধতি #2: স্বাক্ষরিত পূর্ণসংখ্যার জন্য তল বিভাগ ব্যবহার করুন

এখন, যদি কেউ নীচের সংখ্যা রেখার দিকে তাকায়, দুটি স্বাক্ষরবিহীন পূর্ণসংখ্যার মধ্যে পূর্ণসংখ্যা বিভাজনের ফলাফল শূন্যের কাছাকাছি বৃত্তাকার হয়। 1.666 পাওয়ার ক্ষেত্রে, সলিডিটি এটিকে 1 এ রাউন্ড করে, যা একটি ছোট সংখ্যা।


সংখ্যা লাইন


যাইহোক, যখন স্বাক্ষরিত পূর্ণসংখ্যার কথা আসে, -1.6666-এর একটি ফলাফলকে -1-এ রাউন্ড অফ করা হবে, যা দুটি সংখ্যার মধ্যে বড়। সুতরাং, ডিফল্টরূপে সলিডিটিতে প্রয়োগ করা বৃত্তাকার-থেকে-শূন্য বিভাগের বিপরীতে মেঝে বিভাজন অবশ্যই এখানে প্রয়োগ করতে হবে। নির্ভুলতার জন্য, অবশ্যই।


স্বাক্ষরিত পূর্ণসংখ্যার জন্য মেঝে বিভাগ সম্পাদন করা হচ্ছে


ফ্লোট ডেটা টাইপ পাওয়া গেলে -1.666 এর মান গণনা করা হবে। যদিও সলিডিটি এটিকে -1-এ রাউন্ড করবে, স্বাক্ষরিত পূর্ণসংখ্যাগুলিতে ফ্লোর ডিভিশন প্রয়োগ করলে এটি কমিয়ে -2 হবে।


আপনি যখন getResult এবং getResult2 ফাংশনগুলিকে কল করেন, তখন আমরা বিয়োগ এক, তিন এবং পাঁচের আর্গুমেন্টের জন্য নীচে দেখানো মানটি পাই:


getResult2 সঠিক তল বিভাগের ফলাফল দেয়


আপনি যেমন বলতে পারেন, getResult বৃত্তাকার-এর দিকে-শূন্য পদ্ধতির ব্যবহার করে মান গণনা করে যখন getResult2 এটিকে এখানে ক্ষুদ্রতম পূর্ণসংখ্যাতে পরিণত করে, ফ্লোর ডিভিশনের ভিত্তিতে।


পদ্ধতি #3: ABDKMath64x64 লাইব্রেরি ব্যবহার করুন

এখন, চূড়ান্ত পদ্ধতির জন্য, আমরা ABDKMath64x64 লাইব্রেরি ব্যবহার করব, যা বিভাগ অপারেশনের ফলাফলকে নির্দিষ্ট বিন্দু সংখ্যায় রূপান্তর করে।


আবারও, এই লাইব্রেরিটি ব্যবহার করে বলা হয় যে শূন্যের দিকে রাউন্ডিং এর বিপরীতে নির্ভুলতা উন্নত করা যায় যা সলিডিটিতে ডিফল্টরূপে উপলব্ধ। আউটপুট বোঝার জন্য, আসুন div ফাংশনের সাথে অ্যাডের ফলাফলের তুলনা করি, যেমনটি নীচে দেখানো হয়েছে:


ABDK লাইব্রেরি ব্যবহার করে


স্মার্ট কন্ট্রাক্ট স্থাপন করার সময় আপনি আর্গুমেন্ট 1, 1 এবং 1 যোগ করলে, আপনি মানগুলি পাবেন, যেমনটি নীচে দেখানো হয়েছে:

ABDK লাইব্রেরি ব্যবহার করে - আউটপুট


এতে অবাক হওয়ার কিছু নেই যে অ্যাড ফাংশন দুটির একটি পূর্ণসংখ্যার মান প্রদান করে, তিনটি আর্গুমেন্টের সাথে এটি অনেক বেশি যোগ করে। div ফাংশন হিসাবে, একটি int 128 মান ফেরত দেওয়া হয় যা একটি স্বাক্ষরিত 64.64-বিট নির্দিষ্ট বিন্দু সংখ্যাকে প্রতিনিধিত্ব করে এবং যেটি দিয়ে আপনি স্বাভাবিক সংখ্যার ক্রিয়াকলাপ সম্পাদন করতে পারেন।

বিবেচনা করার জন্য অন্যান্য পূর্ণসংখ্যা বিভাগ লাইব্রেরি

অবশ্যই, ABDKMath64x64 লাইব্রেরিই একমাত্র নয় যা পূর্ণসংখ্যা বিভাজন ত্রুটি প্রতিরোধ করা ছাড়াও নির্ভুলতা উন্নত করতে ব্যবহার করা যেতে পারে।


ফিক্সিডিটি , ডিএসএমথ এবং BANKEX লাইব্রেরির কয়েকটি উদাহরণ সহ আরও কয়েকটি রয়েছে যা বিভিন্ন নম্বর বিন্যাস ব্যবহার করে। উপরের উদাহরণে ব্যবহৃত 64.64-বিট ফিক্সড পয়েন্ট নম্বর ফরম্যাট থেকে ভিন্ন নম্বর বিন্যাস। সুতরাং, যদিও এই লাইব্রেরিগুলি অন্বেষণের জন্য উপযোগী বলে মনে হতে পারে, অনুগ্রহ করে মনে রাখবেন যে তাদের নম্বর বিন্যাসগুলি উপলব্ধ অন্যান্য লাইব্রেরির সাথে কাজ করবে না।