Friday 28 December 2018

C float mantissa opções binárias


Eu tenho um programa, que está sendo executado em dois processadores, um dos quais não tem suporte a ponto flutuante. Então, eu preciso executar cálculos de ponto flutuante usando ponto fixo nesse processador. Para esse efeito, eu estarei usando uma biblioteca de emulação de ponto flutuante. Eu preciso primeiro extrair os sinais, mantissas e expoentes de números de ponto flutuante no processador que suportam ponto flutuante. Então, a minha pergunta é como posso obter o sinal, mantissa e expoente de um único número de ponto flutuante de precisão. Seguindo o formato desta figura, Isso é o que eu fiz até agora, mas exceto sinal, nem mantissa e expoente estão corretos. Eu acho, estou faltando alguma coisa. Pediu Mar 28 13 às 15:00 I39m assumindo IEEE 754 binário de 32 bits. Você está ciente dos seguintes problemas (1) O expoente é induzido, adicionando 127 ao expoente real. (2) Todas as flutuações, exceto as muito pequenas, são normalizadas eo primeiro bit de uma mantissa flutuante normalizada não é armazenado. Ndash Patricia Shanahan Mar 28 13 em 17:05 There39s nenhuma lei que diz que você tem que usar apenas as coisas para o que eles foram originalmente criados para. Caso contrário, o primeiro avião não usaria pedaços de bicicleta. QuotGenerallyquot undefined Que sobre aquelas ocasiões em que é definido, ou quando you39re feliz com o comportamento em uma dada plataforma / situação ndash Alex Feb 28 14 at 11:29 Este método falha quando 1) float não é IEEE 754 32 bit binário (não tão Raro) 2) unsigned é de 16 bits (comum no mundo incorporado) 3) endian de unsigned47float não correspondem. (raro). 4) A interpretação matemática é usada para o exponente 47mantissa como esta resposta mostra o expoente polarizado eo significand / mantissa incompleto. Ndash chux Mar 5 at 17:34 Meu conselho é ficar com a regra 0 e não refazer o que as bibliotecas padrão já fazem, se isso é suficiente. Olhe para math. h (cmath no padrão C) e funções frexp, frexpf, frexpl, que quebram um valor de ponto flutuante (double, float, ou duplo longo) em sua parte significand e expoente. Para extrair o sinal do significand você pode usar signbit, também em math. h / cmath, ou copysign (apenas C11). Algumas alternativas, com menor semântica, são modf e ilogb / scalbn, disponível em C11 en. cppreference / w / cpp / numeric / math / logb compara-los, mas eu não encontrei na documentação como todas essas funções se comportam com / - inf E NaNs. Finalmente, se você realmente quiser usar bitmasks (por exemplo, você precisa desesperadamente saber os bits exatos, e seu programa pode ter diferentes NaNs com diferentes representações, e você não confia nas funções acima), pelo menos tornar tudo independente da plataforma usando o Macros em float. h / cfloat. Respondeu Oct 26 13 at 16:12 Você está ampliando os bits errados. Eu acho que você quer: Lembre-se, quando você amp. Você está zerando bits que você não definir. Então, neste caso, você quer zerar o bit de sinal quando você recebe o expoente, e você quer zerar o bit de sinal eo expoente quando você começa a mantissa. Observe que as máscaras vêm diretamente de sua imagem. Assim, a máscara de expoente será parecido com: 0 11111111 00000000000000000000000 ea máscara de mantissa será semelhante a: 0 00000000 11111111111111111111111 respondeu Mar 28 13 at 15:07 Eu ainda don39t obter resultados corretos. Ndash MetallicPriest Mar 28 13 às 15:10 MetallicPriest Tente agora, eu tinha as máscaras erradas pela primeira vez. Ndash Xymostech Mar 28 13 at 15:12 O que sobre o chamado bit escondido eu don39t ver alguém configurá-lo: m 0x00800000. Observe que o número deve ser verificado para valores especiais (denormals, NaN, infinities) em primeiro lugar, uma vez que estes exigem tratamento diferente. Ndash Rudy Velthuis Mar 29 13 às 22:16

No comments:

Post a Comment