Encontre min / max de um float / double que tenha a mesma representação interna

Atualizando empontos flutuantes (Além dissoPDF), IEEE-754 e participandonesta discussão sobre arredondamento de ponto flutuante ao converter em strings, me trouxe para mexer: como posso obter o valor máximo e mínimo para um determinado número de ponto flutuante cujas representações binárias são iguais.

aviso Legal: para esta discussão, eu gosto de manter o ponto flutuante de 32 e 64 bits, conforme descrito pelo IEEE-754. Eu não estou interessado em ponto flutuante estendido (80 bits) ou quads (128 bits IEEE-754-2008) ou qualquer outro padrão (IEEE-854).

fundo: Computadores são ruins em representar0.1 em representação binária. Em C #, um float representa isso como3DCCCCCD internamente (C # usa round-to-mais próximo) e um duplo como3FB999999999999A. Os mesmos padrões de bits são usados ​​para decimal0.100000005 (float) e0.1000000000000000124 (duplo), mas não para0.1000000000000000144 (em dobro).

Por conveniência, o seguinte código C # fornece estas representações 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));

No caso de0.1, não há nenhum número decimal mais baixo representado com o mesmo padrão de bits,0.99...99 produzirá uma representação de bit diferente (isto é, float for0.999999937 rendimentos3F7FFFFF internamente).

Minha pergunta é simples: como posso encontrar o valor decimal mais baixo e mais alto para um determinado float (ou double) que é armazenado internamente na mesma representação binária.

Por quê: (Eu sei que você vai perguntar) para encontrar o erro no arredondamento no .net quando ele converte em uma seqüência de caracteres e quando ele converte de uma seqüência de caracteres, para encontrar o valor exato interno e para entender melhor os meus próprios erros de arredondamento.

Meu palpite é algo como: pegue a mantissa, remova o resto, obtenha seu valor exato, obtenha um (mantissa-bit) maior e calcule a média: qualquer coisa abaixo disso produzirá o mesmo padrão de bit. Meu principal problema é: como obter a parte fracionária como inteiro (manipulação de bits não é meu ativo mais forte).DoubleConverter de Jon Skeet A aula pode ser útil.

questionAnswers(2)

yourAnswerToTheQuestion