Encuentra min / max de un float / double que tiene la misma representación interna

Refrescante enpuntos flotantes (ademásPDF), IEEE-754 y participando.en esta discusión sobre el redondeo de punto flotante al convertir a cadenas, me llevó a juguetear: ¿cómo puedo obtener el valor máximo y mínimo para un número de punto flotante dado cuyas representaciones binarias son iguales?

Renuncia: para esta discusión, me gusta atenerme a los puntos flotantes de 32 y 64 bits según lo descrito por IEEE-754. No estoy interesado en el punto flotante extendido (80 bits) ni en los quads (128 bits IEEE-754-2008) ni en ningún otro estándar (IEEE-854).

Fondo: Las computadoras son malas para representar0.1 En representación binaria. En C #, un flotador representa esto como3DCCCCCD internamente (C # usa redondeo al más cercano) y un doble como3FB999999999999A. Los mismos patrones de bits se utilizan para decimal0.100000005 (flotar) y0.1000000000000000124 (doble), pero no para0.1000000000000000144 (doble).

Para mayor comodidad, el siguiente código C # proporciona estas representaciones internas:

string GetHex(float f)
{
    return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString("X");
}

string GetHex(double d)
{
    return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString("X");
}

// float
Console.WriteLine(GetHex(0.1F));

// double 
Console.WriteLine(GetHex(0.1));

En el caso de0.1, no hay un número decimal inferior que se represente con el mismo patrón de bits, cualquier0.99...99 producirá una representación de bit diferente (es decir, flotante para0.999999937 rendimientos3F7FFFFF internamente).

Mi pregunta es simple: ¿cómo puedo encontrar el valor decimal más bajo y más alto para un flotador dado (o doble) que se almacena internamente en la misma representación binaria?

Por qué: (Sé que preguntarás) para encontrar el error en el redondeo en .NET cuando se convierte en una cadena y cuando se convierte en una cadena, para encontrar el valor exacto interno y para comprender mejor mis propios errores de redondeo.

Mi conjetura es algo como: tome la mantisa, elimine el resto, obtenga su valor exacto, obtenga una (mantisa-bit) más alta y calcule la media: cualquier cosa por debajo que produzca el mismo patrón de bits. Mi principal problema es: cómo obtener la parte fraccional como entero (la manipulación de bits no es mi activo más importante).DoubleConverter de Jon Skeet La clase puede ser útil.

Respuestas a la pregunta(2)

Su respuesta a la pregunta