ফ্লোটিং পয়েন্ট নম্বর (float/double) বাইনরিতে কনভার্ট করা একটু জটিল কারণ IEEE 754 স্ট্যান্ডার্ড অনুযায়ী এটি সাইন, এক্সপোনেন্ট এবং ম্য্যান্টিসা (সিগনিফিকান্ড) - এই তিনটি অংশে ভাগ থাকে। নিচের উদাহরণটি শুধু পূর্ণসংখ্যা অংশের জন্য কাজ করে, পুরো ফ্লোট বাইনরি রিপ্রেজেন্টেশনের জন্য BitConverter ব্যবহার করুন।
সমস্যা: মূল উদাহরণটি অসম্পূর্ণ
মূল কোডটি শুধু পূর্ণসংখ্যা অংশ প্রসেস করে (50.5 এর জন্য 50 প্রসেস করে) এবং দশমিক অংশ উপেক্ষা করে। এছাড়া আউটপুটও ভুল।
সঠিক পদ্ধতি: BitConverter ব্যবহার (IEEE 754)
using System;
public class FloatToBinary
{
public static void Main()
{
float value = 50.5f;
// 4 বাইটে কনভার্ট (IEEE 754 সিঙ্গল প্রিসিশন)
byte[] bytes = BitConverter.GetBytes(value);
Console.WriteLine($"ফ্লোট মান: {value}");
Console.WriteLine("বাইনরি রিপ্রেজেন্টেশন (৩২ বিট):");
// বিট প্যাটার্ন দেখান (MSB first - বিগ ইন্ডিয়ান স্টাইল)
for (int i = bytes.Length - 1; i >= 0; i--)
{
Console.Write(Convert.ToString(bytes[i], 2).PadLeft(8, '0') + " ");
}
Console.WriteLine();
// বিট ভ্রেকডাউন
uint bits = BitConverter.ToUInt32(bytes, 0);
int sign = (int)(bits >> 31);
int exponent = (int)((bits >> 23) & 0xFF);
uint mantissa = bits & 0x7FFFFF;
Console.WriteLine($"\nবিচ্ছিন্ন করলে:");
Console.WriteLine($"সাইন বিট: {sign} ({sign == 0 ? "পজিটিভ" : "নেগেটিভ"})");
Console.WriteLine($"এক্সপোনেন্ট: {exponent} (বায়াস: 127, রিয়েল: {exponent - 127})");
Console.WriteLine($"ম্য্যান্টিসা: {mantissa} (হেক্স: 0x{mantissa:X})");
// বাইনরি স্ট্রিং হিসেবে (সাইন | এক্সপোনেন্ট | ম্য্যান্টিসা)
string binary = Convert.ToString(bits, 2).PadLeft(32, '0');
Console.WriteLine($"\nপূর্ণ ৩২-বিট: {binary.Insert(1, " ").Insert(10, " ")}");
}
}
আউটপুট (৫০.৫ এর জন্য)
ফ্লোট মান: 50.5
বাইনরি রিপ্রেজেন্টেশন (৩২ বিট):
01000010 01001010 00000000 00000000
বিচ্ছিন্ন করলে:
সাইন বিট: 0 (পজিটিভ)
এক্সপোনেন্ট: 132 (বায়াস: 127, রিয়েল: 5)
ম্য্যান্টিসা: 1310720 (হেক্স: 0x140000)
পূর্ণ ৩২-বিট: 0 10000100 10010100000000000000000
IEEE 754 সিঙ্গল প্রিসিশন (৩২ বিট) ফরম্যাট
| সাইন (১ বিট) | এক্সপোনেন্ট (৮ বিট) | ম্য্যান্টিসা (২৩ বিট) | | 0 | 10000100 | 10010100000000000000000 |
- সাইন: 0 = পজিটিভ, 1 = নেগেটিভ
- এক্সপোনেন্ট: ১৩২ (বায়াস ১২৭সহ) → রিয়েল এক্সপোনেন্ট = ৫
- ম্য্যান্টিসা: ১.১০০১০১ (ইমপ্লিসিট লিডিং ১ সহ) = ১.৫৭৮১২৫
- মান: (-1)⁰ × ১.৫৭৮১২৫ × 2⁵ = ৫০.৫ ✓
দশমিক অংশ সহ ম্যানুয়াল কনভার্শন (শিক্ষামূলক উদ্দেশ্যে)
public static string FloatToBinaryManual(float value, int fractionalBits = 16)
{
if (float.IsNaN(value) || float.IsInfinity(value))
return value.ToString();
bool isNegative = value < 0;
value = Math.Abs(value);
int intPart = (int)value;
float fracPart = value - intPart;
// পূর্ণসংখ্যা অংশ বাইনরি
string intBinary = Convert.ToString(intPart, 2);
// ভগ্নাংশ অংশ বাইনরি
string fracBinary = "";
for (int i = 0; i < fractionalBits; i++)
{
fracPart *= 2;
int bit = (int)fracPart;
fracBinary += bit.ToString();
fracPart -= bit;
if (fracPart == 0) break;
}
string sign = isNegative ? "-" : "";
return fracBinary.Length > 0
? $"{sign}{intBinary}.{fracBinary}"
: $"{sign}{intBinary}";
}
// ব্যবহার
Console.WriteLine(FloatToBinaryManual(50.5f)); // আউটপুট: 110010.1
সারসংক্ষেপ
- বাস্তব ব্যবহারে:
BitConverter.GetBytes+BitConverter.ToUInt32/ToUInt64ব্যবহার করুন - শিক্ষামূলক: পূর্ণসংখ্যা এবং ভগ্নাংশ অংশ আলাদা করে বাইনরিতে কনভার্ট করুন
- আউটপুট ফরম্যাট: IEEE 754 (৩২/৬৪ বিট) বা ফিক্সড-পয়েন্ট বাইনরি স্ট্রিং