Tipos de ponto flutuante de tamanho fixo


90

Nos cabeçalhos stdint.h(C99), boost / cstdint.hpp e cstdint(C ++ 0x) existe, entre outros, o tipo int32_t.

Existem tipos semelhantes de ponto flutuante de tamanho fixo? Algo assim float32_t?


4
Por que você precisa de algo assim?
AraK

39
Você precisa de algo assim quando tem uma estrutura de dados com um valor de ponto flutuante e também deseja saber exatamente qual é o seu tamanho.
mob

5
@mobrule: Se você só precisa saber qual é o tamanho, você usa a sizeofoperadora. Um tipo como esse seria útil quando um algoritmo exigir que ele tenha um tamanho específico conhecido.
Stephen Canon

6
@Stephen Canon - sim, para quando você quiser garantir qual é o tamanho. Digamos que uma instância de sua estrutura de dados caberá em 64 bits e pode ser passada por valor para alguma biblioteca externa.
mob

5
@StephenCanon Considere uma biblioteca de serialização de plataforma cruzada. Como pode sizeofser usado para resolver o problema de tipos flutuantes de empacotamento e desempate de forma consistente?
Kyle Strand

Respostas:


47

Nada como isso existe nos padrões C ou C ++ no momento. Na verdade, não há nem mesmo uma garantia de que floatserá um formato de ponto flutuante binário.

Alguns compiladores garantem que o floattipo será o formato binário IEEE-754 de 32 bits. Alguns não. Na realidade, floaté o singletipo IEEE-754 na maioria das plataformas não embarcadas, embora se apliquem as advertências usuais sobre alguns compiladores que avaliam expressões em um formato mais amplo.

Há um grupo de trabalho discutindo a adição de associações de linguagem C para a revisão de 2008 do IEEE-754, que pode considerar a recomendação de adicionar tal typedef. Se isso fosse adicionado ao C, espero que o padrão C ++ siga o exemplo ... eventualmente.


3
Independentemente do IEEE-754 ou não, ele ainda não impedirá problemas de portabilidade endian.
Mark B,

1
@Pietro: alterar o idioma não afetará a compatibilidade do seu hardware, apenas impediria a conformidade de alguns hardwares. Como uma garantia IEEE FP ajudaria na portabilidade?
Potatoswatter

1
@Potatoswatter: Isso encorajaria os fornecedores de hardware a fornecer soluções compatíveis. Se a parte a suportar C padrão sem a necessidade de hacks de biblioteca de flutuação suave e a parte b não, isso é uma vantagem de mercado para a parte a.
Stephen Canon

2
@Potatoswatter: (Quase) ninguém se preocupa com a velocidade do hardware. Nós nos preocupamos com a velocidade do software executado no hardware. O software pode ser mais rápido se o hardware em que está sendo executado for mantido em padrões e o software não precisar detectar e corrigir 15 casos especiais diferentes, dependendo da plataforma em que está sendo executado.
Stephen Canon

8
Como diabos você obteria melhor portabilidade evitando que seu código fosse compilado em várias arquiteturas de nicho? Ou você confia nos flutuadores sendo IEEE, caso em que seu código será executado em todas as implementações compatíveis com IEEE e nada mais, ou não, caso em que seu código será executado em uma variedade maior de sistemas. Se o C ++ garantisse a conformidade com o IEEE, seu código não ficaria magicamente mais portável, você simplesmente descartaria que ele poderia ser executado nessas arquiteturas incompatíveis. Sua lógica é completamente invertida.
jalf

29

Se você quer saber se o seu float é do tipo IEEE de 32 bits, verifique std::numeric_limits<float>::is_iec559. É uma constante de tempo de compilação, não uma função.

Se você quiser ser mais à prova de balas, verifique também std::numeric_limits<float>::digits se eles não estão usando furtivamente o padrão de precisão dupla do IEEE para float. Deve ser 24.

Quando se trata de long double , é mais importante verificar digitsporque existem alguns formatos IEEE que podem ser razoavelmente: 128 bits (dígitos = 113) ou 80 bits (dígitos = 64).

Não seria prático fazer float32_tisso porque você geralmente deseja usar hardware de ponto flutuante, se disponível, e não recorrer a uma implementação de software.


O long doubleformato no OS X (Intel de 32 bits e 64 bits) é exatamente o formato duplo estendido IEEE-754 armazenado na ordem little-endian. Nada de estranho nisso tudo. Os bytes 0-7 contêm o campo de significando e os bytes 8 e 9 contêm os campos de expoente e sinal.
Stephen Canon

@Stephen: isso é uma boa notícia: v). Isso está de acordo com os números que postei?
Potatoswatter

1
Lembre-se de que double extendido (ao contrário dos outros formatos 754) tem um bit de significando líder explícito, então 5.0Ltem um significando de a000000000000000. Seu expoente não enviesado é +2, e a polarização do expoente estendido duplo é 3fff, então o expoente polarizado para 5.0L é 4001. O padrão de bytes real quando armazenado na ordem little-endian é 00 00 00 00 00 00 00 a0 01 40, e se você vir isso como dois inteiros little-endian de 64 bits, verá exatamente o que observou.
Stephen Canon

(*) estendido duplo conforme implementado pela Intel em hardware, isto é. O formato duplo estendido não é realmente definido como os outros dois formatos básicos do IEEE-754 (1985).
Stephen Canon

@Stephen: Tenho quase certeza de que 4001em little-endian é 01 40 00 00 ...Se nada mais, o byte menos significativo vem primeiro. Espero que a sequência a0 01 40apareça em algum lugar do número (se eles apenas executaram uma rotação), mas não acho que você explicou o porquê a0e 01 40estão em metades completamente separadas.
Potatoswatter

18

Se você acha que ter typedefs como float32_t e float64_t é impraticável por alguma razão, você deve estar muito acostumado com seu sistema operacional familiar, compilador, que não consegue olhar para fora de seu pequeno ninho.

Existem hardwares que executam nativamente operações de ponto flutuante IEEE de 32 bits e outros que executam 64 bits. Às vezes, esses sistemas até precisam se comunicar, caso em que é extremamente importante saber se um duplo é de 32 bits ou 64 bits em cada plataforma. Se a plataforma de 32 bits fizesse cálculos excessivos com base nos valores de 64 bits da outra, podemos desejar lançar para a precisão mais baixa, dependendo dos requisitos de tempo e velocidade.

Eu pessoalmente me sinto desconfortável usando flutuadores e duplos, a menos que eu saiba exatamente quantos bits eles estão em minha plataforma. Ainda mais se eu for transferi-los para outra plataforma em algum canal de comunicação.


"Eu pessoalmente me sinto desconfortável usando flutuadores e duplos, a menos que eu saiba exatamente quantos bits eles estão na minha plataforma. Ainda mais se eu for transferi-los para outra plataforma através de algum canal de comunicação." - Quer dizer que você usa formatos de arquivo de texto? Com eles, há a desvantagem do tamanho do arquivo: um float de 32 precisa de 4 bytes; estes em forma de texto podem representar um número de quatro dígitos apenas ...
Pietro

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.