বেশিরভাগ প্রোগ্রামিং ভাষায়, ভাসমান পয়েন্ট সংখ্যাগুলি বৈজ্ঞানিক স্বরলিপির মতো অনেকগুলি প্রতিনিধিত্ব করা হয় : একটি ক্ষতিকারক এবং একটি ম্যান্টিসার সাথে (এটি হিস্ট্যান্টও বলা হয়)। একটি খুব সাধারণ সংখ্যা, বলুন 9.2
, আসলে এই ভগ্নাংশ:
5179139571476070 * 2 -49
যেখানে -49
খুনি এবং ম্যান্টিসা 5179139571476070
। কিছু দশমিক সংখ্যাকে এভাবে উপস্থাপন করা অসম্ভব হওয়ার কারণটি হ'ল घाताবাচক এবং ম্যান্টিসার উভয়ই পূর্ণসংখ্যার হতে হবে। অন্য কথায়, সমস্ত ভাসমানগুলি অবশ্যই 2 এর পূর্ণসংখ্যার শক্তি দ্বারা গুণিত একটি পূর্ণসংখ্যা হতে হবে ।
9.2
সহজভাবে হতে পারে 92/10
তবে 10 টি 2 এন হিসাবে প্রকাশ করা যায় না যদি এন পূর্ণসংখ্যার মানগুলিতে সীমাবদ্ধ থাকে।
ডেটা দেখছি
প্রথমত, 32- এবং 64-বিট তৈরির উপাদানগুলি দেখতে কয়েকটি ফাংশন float
। আপনি যদি কেবলমাত্র আউটপুটটি (পাইথনের উদাহরণ) সম্পর্কে যত্নশীল হন তবে এগুলি সম্পর্কে গ্লস করুন:
def float_to_bin_parts(number, bits=64):
if bits == 32: # single precision
int_pack = 'I'
float_pack = 'f'
exponent_bits = 8
mantissa_bits = 23
exponent_bias = 127
elif bits == 64: # double precision. all python floats are this
int_pack = 'Q'
float_pack = 'd'
exponent_bits = 11
mantissa_bits = 52
exponent_bias = 1023
else:
raise ValueError, 'bits argument must be 32 or 64'
bin_iter = iter(bin(struct.unpack(int_pack, struct.pack(float_pack, number))[0])[2:].rjust(bits, '0'))
return [''.join(islice(bin_iter, x)) for x in (1, exponent_bits, mantissa_bits)]
এই ফাংশনটির পিছনে অনেক জটিলতা রয়েছে, এবং এটি ব্যাখ্যা করার জন্য যথেষ্ট স্পর্শকাতর হতে চাই তবে আপনি যদি আগ্রহী হন তবে আমাদের উদ্দেশ্যগুলির জন্য গুরুত্বপূর্ণ উত্স হ'ল স্ট্রাক্ট মডিউল।
পাইথন float
একটি 64-বিট, ডাবল-স্পষ্টতা নম্বর prec সি, সি ++, জাভা এবং সি # এর মতো অন্যান্য ভাষায় ডাবল-স্পষ্টকরণের একটি পৃথক প্রকার রয়েছে double
, যা প্রায়শই 64৪ বিট হিসাবে প্রয়োগ করা হয়।
আমরা যখন আমাদের উদাহরণ সহ সেই ফাংশনটি কল করি, তখন আমরা 9.2
যা পাই তা এখানে:
>>> float_to_bin_parts(9.2)
['0', '10000000010', '0010011001100110011001100110011001100110011001100110']
ডেটা ব্যাখ্যার
আপনি দেখতে পাবেন যে আমি রিটার্ন মানটি তিনটি ভাগে বিভক্ত করেছি। এই উপাদানগুলি হ'ল:
- চিহ্ন
- সূচক
- ম্যান্টিসা (সিগনিফিক্যান্ড বা ভগ্নাংশও বলা হয়)
চিহ্ন
সাইনটি প্রথম উপাদানটিতে একক বিট হিসাবে সংরক্ষণ করা হয়। এটি ব্যাখ্যা করা সহজ: এর 0
অর্থ ফ্লোটটি একটি ধনাত্মক সংখ্যা; 1
এর অর্থ এটি নেতিবাচক। কারণ 9.2
ইতিবাচক, আমাদের সাইন মান 0
।
সূচক
এক্সপোনেন্টটি 11 বিট হিসাবে মাঝের উপাদানগুলিতে সংরক্ষণ করা হয়। আমাদের ক্ষেত্রে 0b10000000010
,। দশমিক, এটি মান উপস্থাপন করে 1026
। এই উপাদানটি একটি ছল যে আপনি একটি সংখ্যার সমান বিয়োগ হবে 2 1 - (বিট #) - 1 সত্য এক্সপোনেন্ট পেতে; আমাদের ক্ষেত্রে, এর অর্থ প্রকৃত ব্যয়কারী (দশমিক সংখ্যা 3) পেতে 0b1111111111
(দশমিক সংখ্যা 1023
) বিয়োগ করা 0b00000000011
।
অংশক
ম্যান্টিসা তৃতীয় উপাদানটিতে 52 বিট হিসাবে সংরক্ষণ করা হয়। যাইহোক, এই উপাদানটির পাশাপাশি একটি গৌরব রয়েছে। এই ছদ্মবেশ বুঝতে, বৈজ্ঞানিক স্বরলিপি একটি নম্বর বিবেচনা করুন:
6.0221413x10 23
ম্যান্টিসা হবে 6.0221413
। মনে রাখবেন যে বৈজ্ঞানিক স্বরলিপিতে ম্যান্টিসার সর্বদা একক অ শূন্য অঙ্কের সাথে শুরু হয়। বাইনারিটির ক্ষেত্রে একই দুটি ক্ষেত্রেই কেবল দুটি সংখ্যা রয়েছে: 0
এবং 1
। তাই বাইনারি ম্যান্টিসা সবসময়ই শুরু হয় 1
! যখন একটি ফ্লোট সংরক্ষণ করা হয়, 1
বাইনারি ম্যান্টিসার সামনের অংশটি স্থান বাঁচাতে বাদ দেওয়া হয়; আসল মান্টিসা পেতে আমাদের এটি আমাদের তৃতীয় উপাদানটির সামনে রেখে দিতে হবে :
1,0010011001100110011001100110011001100110011001100110
এটি কেবলমাত্র একটি সাধারণ সংযোজনের চেয়ে বেশি জড়িত, কারণ আমাদের তৃতীয় উপাদানগুলিতে সঞ্চিত বিটগুলি মূলত ম্যান্ডিসার ভগ্নাংশের অংশটিকে, রেডিক্স পয়েন্টের ডানদিকে উপস্থাপন করে ।
দশমিক সংখ্যার সাথে কাজ করার সময়, আমরা দশমিক দশকের গুণমান বা বিভাজন দ্বারা "দশমিক বিন্দু স্থানান্তরিত করি" বাইনারি ভাষায়, আমরা ২ এর পাওয়ার দ্বারা বিভাজন বা ভাগ করে একই জিনিসটি করতে পারি, যেহেতু আমাদের তৃতীয় উপাদানটিতে 52 বিট রয়েছে, তাই আমরা বিভক্ত হয়েছি এটি 2 52 দ্বারা এটি 52 টি স্থান ডানদিকে নিয়ে যেতে:
0,0010011001100110011001100110011001100110011001100110
দশমিক স্বীকৃতিতে, এটি পাওয়ার জন্য ভাগ 675539944105574
করে নেওয়া সমান । (এটি একটি অনুপাতের একটি উদাহরণ যা বাইনারিতে ঠিক প্রকাশ করা যেতে পারে তবে প্রায় দশমিক দশমিক; আরও বিশদ জন্য দেখুন: 675539944105574/4503599627370496 ।)4503599627370496
0.1499999999999999
এখন যে আমরা তৃতীয় উপাদানটিকে একটি ভগ্নাংশের সংখ্যায় রূপান্তর করেছি, যুক্ত 1
করে সত্যিকারের মান্টিসা দিয়েছি।
উপাদানগুলি পুনরায় প্রয়োগ করা হচ্ছে
- সাইন (প্রথম উপাদান):
0
ধনাত্মক 1
জন্য, নেতিবাচক জন্য
- খাঁটি (মাঝের উপাদান): আসল ব্যয়কারী পেতে 2 (বিটের # টি) - 1 - 1 বিয়োগ করুন
- মান্টিসা (শেষ উপাদান): 2 (# বিটের # ) দিয়ে ভাগ করুন
1
এবং সত্যিকারের মান্টিসা যোগ করুন
সংখ্যা গণনা করা হচ্ছে
তিনটি অংশ একসাথে রেখে, আমাদের এই বাইনারি নম্বর দেওয়া হয়েছে:
1.0010011001100110011001100110011001100110011001100110 এক্স 10 11
যা আমরা তখন বাইনারি থেকে দশকে রূপান্তর করতে পারি:
1.1499999999999999 x 2 3 (নিখুঁত!)
9.2
ভাসমান পয়েন্টের মান হিসাবে সংরক্ষণের পরে আমরা ( ) দিয়ে শুরু করা সংখ্যার চূড়ান্ত উপস্থাপনাটি প্রকাশ করার জন্য গুণিত করুন :
9,1999999999999993
ভগ্নাংশ হিসাবে উপস্থাপন করা
9.2
এখন আমরা সংখ্যাটি তৈরি করেছি, এটি একটি সাধারণ ভগ্নাংশে পুনর্গঠন করা সম্ভব:
1.0010011001100110011001100110011001100110011001100110 এক্স 10 11
পুরো সংখ্যায় মান্টিসা স্থানান্তর করুন:
10010011001100110011001100110011001100110011001100110 এক্স 10 11-110100
দশমিক রূপান্তর করুন:
5179139571476070 x 2 3-52
ব্যয়কারীকে বিয়োগ করুন:
5179139571476070 x 2 -49
নেতিবাচক অভিজাতকে বিভাগে পরিণত করুন:
5179139571476070/2 49
ঘনক্ষেত্র:
5179139571476070/562949953421312
যা সমান:
9,1999999999999993
9.5
>>> float_to_bin_parts(9.5)
['0', '10000000010', '0011000000000000000000000000000000000000000000000000']
ইতিমধ্যে আপনি দেখতে পারেন ম্যান্টিসাটি কেবলমাত্র 4 টি অঙ্কের পরে পুরো শূন্যের পরে। তবে চলুন গতিবেগের মধ্য দিয়ে through
বাইনারি বৈজ্ঞানিক স্বরলিপি জমা দিন:
1.0011 x 10 11
দশমিক বিন্দু স্থানান্তর:
10011 x 10 11-100
ব্যয়কারীকে বিয়োগ করুন:
10011 x 10 -1
বাইনারি থেকে দশমিক:
19 এক্স 2 -1
বিভাগে নেতিবাচক ঘাতক:
19/2 1
ঘনক্ষেত্র:
19/2
সমান:
9.5
আরও পড়া