فرمتبندی و بازیابی دوطرفه اعداد ممیز شناور در قالب هگزادسیمال در NET 11.
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۰۵ ۰۸:۳۵
آدرس: www.dntips.ir
چکیده: در نسخههای قبلی فریمورک .NET، فرمتبندی اعداد در مبنای ۱۶ (Hexadecimal) منحصراً برای انواع دادهای صحیح (Integer) پشتیبانی میشد و تلاش برای اعمال مشخصههای فرمت هگز (xیاX) بر روی اعداد ممیز شناور (Floating-Point) منجر به صدور خطای استثنایFormatExceptionمیگردید. با معرفی .NET 11، این محدودیت دیرینه برطرف شده و قابلیت نمایش مستقیم اعداد اعشاری ممیز شناور در قالب هگزادسیمال و همچنین پارس (Parse) معکوس و بازیابی دقیق آنها (Round-tripping) فراهم شده است. این مقاله به بررسی تخصصی نحوه کارکرد این ویژگی جدید، ساختار استاندارد نمایش هگز ممیز شناور (C99 Hex Float Notation)، نحوه بازیابی دادهها با استفاده ازNumberStyles.HexFloatو اهمیت عملی آن در برنامهنویسی سیستمی و خطایابی میپردازد.
x (حروف کوچک) یا X (حروف بزرگ) استفاده میکردند:// فرمتبندی عدد صحیح به هگزادسیمال (خروجی: 7b)
Console.WriteLine(1_000.ToString("x"));
// فرمتبندی با حروف بزرگ (خروجی: 7B)
Console.WriteLine(1_000.ToString("X"));double یا float) به کار ببرد، با خطای صریح زمان اجرا (Runtime Exception) مواجه میشد:// در .NET 10 و نسخههای پیشین: بروز FormatException
var naturalLog = Math.E;
Console.WriteLine(naturalLog.ToString("x")); // System.FormatException: Format specifier was invalid.ToString("x") یا استفاده از String Interpolation با الگوی $"{val:x}" روی اعداد ممیز شناور کاملاً معتبر است و خروجی استانداردی تولید میکند:// نمایش عدد پایه لوگاریتم طبیعی (e) در قالب هگزادسیمال
var naturalLog = Math.E;
// روش اول: متد ToString
Console.WriteLine(naturalLog.ToString("x"));
// روش دوم: String Interpolation
Console.WriteLine($"{naturalLog:x}");
// روش سوم: استفاده از حروف بزرگ برای بخشهای حرفی
Console.WriteLine($"{naturalLog:X}");0x1.5bf0a8b145769p+10x: نشاندهنده مبنای ۱۶ بودن عدد است.1.5bf0a8b145769: بخش مانتیس (Significand / Mantissa) در مبنای ۱۶ است.p+1: نشاندهنده توان نمایی در مبنای ۲ است. استفاده از کاراکتر p (مخفف Power) به جای e به این دلیل است که حرف e خود یکی از ارقام مجاز در مبنای ۱۶ محسوب میشود.0.1) اغلب امکان نمایش دقیق در سیستم دوئال/باینری رایانه را ندارند. اما نماهای هگز ممیز شناور به طور دقیق ساختار بیتهای حافظه را بازنمایی میکنند.NumberStyles.HexFloat به فضای نام System.Globalization فراهم شده است:using System;
using System.Globalization;
// ۱. محاسبه مقدار و تبدیل به رشته هگزادسیمال
var naturalLog = Math.E;
string hexValue = naturalLog.ToString("x");
// ۲. پارس معکوس رشته هگز به عدد double با استفاده از NumberStyles.HexFloat
double parsedNumber = double.Parse(hexValue, NumberStyles.HexFloat);
// ۳. بررسی و صحتسنجی برابری کامل
Console.WriteLine($"رشته هگز: {hexValue}");
Console.WriteLine($"عدد بازیابی شده: {parsedNumber}");
Console.WriteLine($"برابری دقیق (Parity): {parsedNumber == naturalLog}"); // TrueparsedNumber == naturalLog برابر با true است. این یعنی یک Round-trip موفق اتفاق افتاده و مقدار بازیابی شده از رشته هگز، بیتبهبیت با مقدار اولیه یکسان است.| حوزه کاربرد | توضیحات و مزیت فنی |
| دیباگینگ و بازرسی حافظه (Memory Dump) | امکان مشاهده دقیق بیتهای مانتیس و توان اعداد اعشاری بدون تغییر شکل ناشی از تبدیل به مبنای ۱۰. |
| سریالسازی بینقص (Exact Serialization) | ذخیرهسازی و انتقال اعداد ممیز شناور در فایلهای کانفیگ یا بستر شبکه بدون کوچکترین افت دقت اعشاری (Lossless Persistence). |
| تعامل با C++/C و Interop | سازگاری کامل با استانداردهای C99/C++11 در تبادل دادههای ماتریسی، محاسبات علمی و کدهای گرافیکی (Shaders & 3D Math). |
FormatException و معرفی نماد استاندارد C99 به همراه NumberStyles.HexFloat، تضمین میکند که توسعهدهندگان میتوانند اعداد اعشاری را بدون کوچکترین خطای گردکردن بین رشته و مبنای عددی اصلی جابهجا نمایند.