using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Float64
{
public Float64(double x) { ULong = 0; Double = x; }
public static implicit operator Float64(double x) { return new Float64(x); }
public static implicit operator double(Float64 x) { return x.Double; }
[FieldOffset(0)] public double Double;
[FieldOffset(0)] public ulong ULong;
public ulong Mantissa
{
get { return ULong & 0xFFFFFFFFFFFFF; }
set { ULong = ULong & ~0xFFFFFFFFFFFFFULL | value & 0xFFFFFFFFFFFFFULL; }
}
public uint Exp
{
get { return (uint)((ULong >> 52) & 0x7FF); }
set { ULong = ULong & 0x800FFFFFFFFFFFFFULL | ((ulong)(value & 0x7FF) << 52); }
}
public uint Sign
{
get { return (uint)(ULong >> 63); }
set { ULong = ULong & 0x7FFFFFFFFFFFFFFFULL | ((ulong)value << 63); }
}
}
public class Test
{
private static void Print(Float64 x)
{
Console.WriteLine("{0,7} {1:X16} s={4} m={2:X13} e={3:X3}", x.Double, x.ULong, x.Mantissa, x.Exp, x.Sign);
}
public static void Main()
{
foreach (var d in new double [] { 0,1,-1,2,-2,3,-3,3.25,-3.25 })
Print(d);
Float64 x = 1;
Print(x);
++x.Exp; Print(x); // 2
x.Sign = 1; Print(x); // -2
x.Mantissa += 1ULL << 51; Print(x); // -3
--x.Exp; Print(x); // -1.5
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgpbU3RydWN0TGF5b3V0KExheW91dEtpbmQuRXhwbGljaXQpXQpzdHJ1Y3QgRmxvYXQ2NAp7CiAgcHVibGljIEZsb2F0NjQoZG91YmxlIHgpIHsgVUxvbmcgPSAwOyBEb3VibGUgPSB4OyB9CiAgcHVibGljIHN0YXRpYyBpbXBsaWNpdCBvcGVyYXRvciBGbG9hdDY0KGRvdWJsZSB4KSB7IHJldHVybiBuZXcgRmxvYXQ2NCh4KTsgfQogIHB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgZG91YmxlKEZsb2F0NjQgeCkgeyByZXR1cm4geC5Eb3VibGU7IH0KCiAgW0ZpZWxkT2Zmc2V0KDApXSBwdWJsaWMgZG91YmxlIERvdWJsZTsKICBbRmllbGRPZmZzZXQoMCldIHB1YmxpYyB1bG9uZyAgVUxvbmc7CiAgCiAgcHVibGljIHVsb25nIE1hbnRpc3NhCiAgewogICAgZ2V0IHsgcmV0dXJuIFVMb25nICYgMHhGRkZGRkZGRkZGRkZGOyB9CiAgICBzZXQgeyBVTG9uZyA9IFVMb25nICYgfjB4RkZGRkZGRkZGRkZGRlVMTCB8IHZhbHVlICYgMHhGRkZGRkZGRkZGRkZGVUxMOyB9CiAgfQogIAogIHB1YmxpYyB1aW50IEV4cAogIHsKICAgIGdldCB7IHJldHVybiAodWludCkoKFVMb25nID4+IDUyKSAmIDB4N0ZGKTsgfQogICAgc2V0IHsgVUxvbmcgPSBVTG9uZyAmIDB4ODAwRkZGRkZGRkZGRkZGRlVMTCB8ICgodWxvbmcpKHZhbHVlICYgMHg3RkYpIDw8IDUyKTsgfQogIH0KCiAgcHVibGljIHVpbnQgU2lnbgogIHsKICAgIGdldCB7IHJldHVybiAodWludCkoVUxvbmcgPj4gNjMpOyB9CiAgICBzZXQgeyBVTG9uZyA9IFVMb25nICYgMHg3RkZGRkZGRkZGRkZGRkZGVUxMIHwgKCh1bG9uZyl2YWx1ZSA8PCA2Myk7IH0KICB9Cn0KCnB1YmxpYyBjbGFzcyBUZXN0CnsKICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50KEZsb2F0NjQgeCkKICB7CiAgICBDb25zb2xlLldyaXRlTGluZSgiezAsN30gezE6WDE2fSBzPXs0fSBtPXsyOlgxM30gZT17MzpYM30iLCB4LkRvdWJsZSwgeC5VTG9uZywgeC5NYW50aXNzYSwgeC5FeHAsIHguU2lnbik7CiAgfQoKICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCiAgewogIAlmb3JlYWNoICh2YXIgZCBpbiBuZXcgZG91YmxlIFtdIHsgMCwxLC0xLDIsLTIsMywtMywzLjI1LC0zLjI1IH0pCiAgCSAgUHJpbnQoZCk7CiAgCSAgCiAgCUZsb2F0NjQgeCA9IDE7CglQcmludCh4KTsKCSsreC5FeHA7IFByaW50KHgpOyAvLyAyCgl4LlNpZ24gPSAxOyBQcmludCh4KTsgLy8gLTIKCXguTWFudGlzc2EgKz0gMVVMTCA8PCA1MTsgUHJpbnQoeCk7IC8vIC0zCgktLXguRXhwOyBQcmludCh4KTsgLy8gLTEuNQogIH0KfQ==