using System;
class DoubleInfo
{
public long Mantissa;
public int Exponent;
public bool IsNegative;
public override string ToString()
{
return
$"Mantissa: {Mantissa:X8}, Exponent: {Exponent}, " +
$"Sign: {(IsNegative ? '-' : '+')}";
}
}
class Program
{
static DoubleInfo ExtractInfo(double d)
{
if (double.IsInfinity(d) || double.IsNaN(d))
return null;
var result = new DoubleInfo();
long bits = BitConverter.DoubleToInt64Bits(d);
result.IsNegative = bits < 0;
result.Exponent = (int) ((bits >> 52) & 0x7ffL);
result.Mantissa = bits & 0xfffffffffffffL;
if (result.Exponent == 0) // субнормальные числа
result.Exponent++;
else // нормальные числа, добавляем ведущий бит
result.Mantissa = result.Mantissa | (1L << 52);
result.Exponent -= 1023; // экспонента сдвинута на 1023
return result;
}
static void Main(string[] args)
{
double d1 = 2.1;
double d2 = 2;
double diff = d1 - d2;
Console.WriteLine($"d1 : {ExtractInfo(d1)}");
Console.WriteLine($"d2 : {ExtractInfo(d2)}");
Console.WriteLine($"d1 - d2: {ExtractInfo(diff)}");
}
}
dXNpbmcgU3lzdGVtOwoKY2xhc3MgRG91YmxlSW5mbwp7CiAgICBwdWJsaWMgbG9uZyBNYW50aXNzYTsKICAgIHB1YmxpYyBpbnQgRXhwb25lbnQ7CiAgICBwdWJsaWMgYm9vbCBJc05lZ2F0aXZlOwoKICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybgogICAgICAgICAgICAkIk1hbnRpc3NhOiB7TWFudGlzc2E6WDh9LCBFeHBvbmVudDoge0V4cG9uZW50fSwgIiArCiAgICAgICAgICAgICQiU2lnbjogeyhJc05lZ2F0aXZlID8gJy0nIDogJysnKX0iOwogICAgfQp9CgpjbGFzcyBQcm9ncmFtCnsKICAgIHN0YXRpYyBEb3VibGVJbmZvIEV4dHJhY3RJbmZvKGRvdWJsZSBkKQogICAgewogICAgICAgIGlmIChkb3VibGUuSXNJbmZpbml0eShkKSB8fCBkb3VibGUuSXNOYU4oZCkpCiAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IERvdWJsZUluZm8oKTsKICAgICAgICBsb25nIGJpdHMgPSBCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCk7CgogICAgICAgIHJlc3VsdC5Jc05lZ2F0aXZlID0gYml0cyA8IDA7CiAgICAgICAgcmVzdWx0LkV4cG9uZW50ID0gKGludCkgKChiaXRzID4+IDUyKSAmIDB4N2ZmTCk7CiAgICAgICAgcmVzdWx0Lk1hbnRpc3NhID0gYml0cyAmIDB4ZmZmZmZmZmZmZmZmZkw7CgogICAgICAgIGlmIChyZXN1bHQuRXhwb25lbnQgPT0gMCkgLy8g0YHRg9Cx0L3QvtGA0LzQsNC70YzQvdGL0LUg0YfQuNGB0LvQsAogICAgICAgICAgICByZXN1bHQuRXhwb25lbnQrKzsKICAgICAgICBlbHNlIC8vINC90L7RgNC80LDQu9GM0L3Ri9C1INGH0LjRgdC70LAsINC00L7QsdCw0LLQu9GP0LXQvCDQstC10LTRg9GJ0LjQuSDQsdC40YIKICAgICAgICAgICAgcmVzdWx0Lk1hbnRpc3NhID0gcmVzdWx0Lk1hbnRpc3NhIHwgKDFMIDw8IDUyKTsKCiAgICAgICAgcmVzdWx0LkV4cG9uZW50IC09IDEwMjM7IC8vINGN0LrRgdC/0L7QvdC10L3RgtCwINGB0LTQstC40L3Rg9GC0LAg0L3QsCAxMDIzCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgZG91YmxlIGQxID0gMi4xOwogICAgICAgIGRvdWJsZSBkMiA9IDI7CiAgICAgICAgZG91YmxlIGRpZmYgPSBkMSAtIGQyOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiZDEgICAgIDoge0V4dHJhY3RJbmZvKGQxKX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkImQyICAgICA6IHtFeHRyYWN0SW5mbyhkMil9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJkMSAtIGQyOiB7RXh0cmFjdEluZm8oZGlmZil9Iik7CiAgICB9Cn0=