বাইনারি কী হচ্ছে তা এখানে। যেমনটি আমরা জানি, কিছু ভাসমান-পয়েন্টের মানগুলি বাইনারিতে হুবহু উপস্থাপন করা যায় না, এমনকি যদি সেগুলি দশমিক ক্ষেত্রেও ঠিক উপস্থাপন করা যায়। এই 3 টি সংখ্যা সেই বাস্তবতার উদাহরণ মাত্র।
এই প্রোগ্রামটির সাথে আমি প্রতিটি সংখ্যার হেক্সাডেসিমাল উপস্থাপনা এবং প্রতিটি সংযোজনের ফলাফল আউটপুট করি।
public class Main{
public static void main(String args[]) {
double x = 23.53; // Inexact representation
double y = 5.88; // Inexact representation
double z = 17.64; // Inexact representation
double s = 47.05; // What math tells us the sum should be; still inexact
printValueAndInHex(x);
printValueAndInHex(y);
printValueAndInHex(z);
printValueAndInHex(s);
System.out.println("--------");
double t1 = x + y;
printValueAndInHex(t1);
t1 = t1 + z;
printValueAndInHex(t1);
System.out.println("--------");
double t2 = x + z;
printValueAndInHex(t2);
t2 = t2 + y;
printValueAndInHex(t2);
}
private static void printValueAndInHex(double d)
{
System.out.println(Long.toHexString(Double.doubleToLongBits(d)) + ": " + d);
}
}
দ্য printValueAndInHex
পদ্ধতি মাত্র একটি হেক্স-প্রিন্টার সাহায্যকারী নেই।
আউটপুট নিম্নরূপ:
403787ae147ae148: 23.53
4017851eb851eb85: 5.88
4031a3d70a3d70a4: 17.64
4047866666666666: 47.05
--------
403d68f5c28f5c29: 29.41
4047866666666666: 47.05
--------
404495c28f5c28f6: 41.17
4047866666666667: 47.050000000000004
প্রথম 4 সংখ্যা x
, y
, z
, এবং s
এর হেক্সাডেসিমেল উপস্থাপনা। আইইইইই ভাসমান পয়েন্ট উপস্থাপনায়, বিট 2-12 বাইনারি এক্সপোনেন্টকে প্রতিনিধিত্ব করে , যা সংখ্যার স্কেল। (প্রথম বিটটি হ'ল সাইন বিট এবং ম্যান্টিসার বাকী বিট )) উপস্থাপকটি হ'ল আসলে বাইনারি সংখ্যা বিয়োগ 1023।
প্রথম 4 টি সংখ্যার জন্য এক্সটেন্ডারগুলি বের করা হয়:
sign|exponent
403 => 0|100 0000 0011| => 1027 - 1023 = 4
401 => 0|100 0000 0001| => 1025 - 1023 = 2
403 => 0|100 0000 0011| => 1027 - 1023 = 4
404 => 0|100 0000 0100| => 1028 - 1023 = 5
সংযোজনের প্রথম সেট
দ্বিতীয় সংখ্যাটি ( y
) ছোট আকারের। এই দুটি সংখ্যা পেতে যোগ করার সময় x + y
, দ্বিতীয় সংখ্যা ( 01
) এর শেষ 2 বিটগুলি সীমার বাইরে চলে যায় এবং গণনাটির মধ্যে থাকে না।
দ্বিতীয় সংযোজন যোগ করে x + y
এবং z
একই স্কেলের দুটি সংখ্যা যুক্ত করে।
সংযোজন দ্বিতীয় সেট
এখানে, x + z
প্রথম ঘটে। এগুলি একই স্কেলের, তবে তারা এমন একটি সংখ্যা দেয় যা স্কেলের চেয়ে বেশি:
404 => 0|100 0000 0100| => 1028 - 1023 = 5
দ্বিতীয় সংযোজন যোগ করে x + z
এবং y
, এবং এখন 3 টি বিটগুলি y
সংখ্যা ( 101
) যুক্ত করতে বাদ দেওয়া হয় । এখানে অবশ্যই উপরে একটি বৃত্তাকার হতে হবে, কারণ ফলাফলটি পরবর্তী ভাসমান পয়েন্ট নম্বর আপ: 4047866666666666
বনাম সংযোজনের প্রথম সেটটির জন্য4047866666666667
দ্বিতীয় সেটের জন্য জন্য। মোট প্রিন্টআউটে প্রদর্শিত ত্রুটিটি যথেষ্ট তাৎপর্যপূর্ণ।
উপসংহারে, আইইইই সংখ্যাতে গাণিতিক ক্রিয়াকলাপ সম্পাদন করার সময় সতর্কতা অবলম্বন করুন। কিছু উপস্থাপনা নিখুঁত হয় এবং স্কেলগুলি পৃথক হয়ে গেলে সেগুলি আরও নিখুঁত হয়। আপনি যদি পারেন তবে অনুরূপ স্কেলের সংখ্যাগুলি বিয়োগ করুন।
(2.0^53 + 1) - 1 == 2.0^53 - 1 != 2^53 == 2^53 + (1 - 1)
)। সুতরাং, হ্যাঁ: অঙ্কগুলি এবং অন্যান্য ক্রিয়াকলাপের ক্রমটি বেছে নেওয়ার ক্ষেত্রে সতর্ক থাকুন। কিছু ভাষা "উচ্চ-নির্ভুলতা" যোগফলগুলি (উদাহরণস্বরূপ পাইথনেরmath.fsum
) সঞ্চালনের জন্য অন্তর্নির্মিত সরবরাহ করে , তাই আপনি নিষ্পাপ যোগ অ্যালগোরিদমের পরিবর্তে এই ফাংশনগুলি ব্যবহার করার বিষয়ে বিবেচনা করতে পারেন।