Friday 4 August 2017

Floating Point Notation Binary Options


Problemas de Frações Binárias Enquanto eles trabalham o mesmo em princípio, as frações binárias são diferentes das frações decimais em que números podem representar com precisão com um dado número de dígitos e, portanto, também em que números resultam em erros de arredondamento: Especificamente, binário só pode representar aqueles Números como uma fração finita onde o denominador é uma potência de 2. Infelizmente, isso não inclui a maioria dos números que podem ser representados como fração finita na base 10, como 0,1. Arredondado para 4 dígitos Valor arredondado como fração E é assim que você já obtém um erro de arredondamento quando você apenas anotar um número como 0,1 e executá-lo através do seu intérprete ou compilador. Não é tão grande quanto 3/80 e pode ser invisível porque os computadores cortados após 23 ou 52 dígitos binários ao invés de 4. Mas o erro está lá e irá causar problemas, eventualmente, se você simplesmente ignorá-lo. Por que usar binário No nível mais baixo, os computadores são baseados em bilhões de elementos elétricos que têm apenas dois estados, (geralmente baixa e alta tensão). Ao interpretar estes como 0 e 1, é muito fácil de construir circuitos para armazenar números binários e fazer cálculos com eles. Embora seja possível simular o comportamento de números decimais com circuitos binários, bem, seu menos eficiente. Se os computadores usassem números decimais internamente, eles teriam menos memória e seriam mais lentos no mesmo nível de tecnologia. Como a diferença de comportamento entre números binários e decimais não é importante para a maioria das aplicações, a escolha lógica é construir computadores com base em números binários e viver com o fato de que alguns cuidados e esforços extras são necessários para aplicativos que exigem comportamento decimal. O guia de ponto flutuante Início Referências básicas Referências xkcd Número Formatssprintf sprintf Retorna uma seqüência de caracteres formatada pelas convenções de printf usuais da função de biblioteca de C sprintf. Veja abaixo para mais detalhes e veja sprintf (3) ou printf (3) em seu sistema para uma explicação dos princípios gerais. O Perl faz sua própria formatação sprintf: ele emula a função sprintf (3). Mas não usá-lo, exceto para números de ponto flutuante, e mesmo assim apenas modificadores padrão são permitidos. Extensões não-padrão em seu sprintf local (3), portanto, não estão disponíveis a partir do Perl. Ao contrário do printf. Sprintf não faz o que você provavelmente quer dizer quando você passa uma matriz como seu primeiro argumento. O array é dado contexto escalar, e em vez de usar o 0 º elemento da matriz como o formato, Perl usará a contagem de elementos na matriz como o formato, que quase nunca é útil. Perls sprintf permite as seguintes conversões universalmente conhecidas: Além disso, o Perl permite as seguintes conversões amplamente suportadas: Finalmente, para a compatibilidade para trás (e nós queremos significar para trás), Perl permite essas conversões desnecessárias mas amplamente suportadas: Note que o número de conversões Expoente na notação científica produzida por e. E. g e G para números com o módulo do expoente inferior a 100 é dependente do sistema: pode ser três ou menos (zero-padded conforme necessário). Em outras palavras, 1,23 vezes dez para o 99 pode ser 1,23e99 ou 1,23e099. Da mesma forma para a e A. o expoente ou os dígitos hexadecimais podem flutuar: especialmente a opção de configuração Perl de dupla longa pode causar surpresas. Entre o e a letra do formato, você pode especificar vários atributos adicionais que controlam a interpretação do formato. Em ordem, estes são: Um índice de parâmetro de formato explícito, como 2. Por padrão sprintf irá formatar o próximo argumento não utilizado na lista, mas isso permite que você tome os argumentos fora de ordem: Quando um espaço e um sinal de mais são dadas Como as bandeiras de uma vez, o espaço é ignorado. Quando a sinalização e uma precisão são dadas na conversão o, a precisão é incrementada se for necessário para o líder 0. Este sinalizador diz Perl para interpretar a seqüência fornecida como um vetor de inteiros, um para cada caractere na seqüência de caracteres. O Perl aplica o formato a cada inteiro, por sua vez, e depois associa as seqüências resultantes com um separador (um ponto, por padrão). Isso pode ser útil para exibir valores ordinais de caracteres em cadeias arbitrárias: Coloque um asterisco antes do v para substituir a seqüência de caracteres a ser usada para separar os números: Você também pode especificar explicitamente o número do argumento a ser usado para a cadeia de junção usando algo como 2v para Exemplo: Argumentos geralmente são formatados para ser tão ampla quanto necessário para exibir o valor especificado. Você pode substituir a largura colocando um número aqui, ou obter a largura do próximo argumento (com) ou a partir de um argumento especificado (por exemplo, com 2): Se uma largura de campo obtida através de é negativo, tem o mesmo efeito que o - Flag: left-justification. Você pode especificar uma precisão (para conversões numéricas) ou uma largura máxima (para conversões de seqüência) especificando a. Seguido por um número. Para formatos de ponto flutuante, exceto g e G. Isso especifica quantos lugares à direita do ponto decimal para mostrar (o padrão é 6). Por exemplo: Para g e G, isso especifica o número máximo de dígitos a serem exibidos, incluindo os anteriores ao ponto decimal e os seguintes: Por conversões de números inteiros, especificar uma precisão implica que a saída do próprio número deve ser zero - padded a essa largura, onde o sinalizador 0 é ignorado: Para conversões de seqüência de caracteres, especificando uma precisão trunca a seqüência de caracteres para ajustar a largura especificada: Você também pode obter a precisão do próximo argumento usando .. ou a partir de um argumento especificado .2): Se uma precisão obtida através de é negativa, ele conta como não tendo nenhuma precisão em tudo. Para conversões numéricas, você pode especificar o tamanho para interpretar o número como usando l. H. V. q. L. ou ll. Para conversões de número inteiro (duox X bi DUO), os números normalmente são assumidos como sendo o tamanho inteiro padrão na sua plataforma (geralmente 32 ou 64 bits), mas você pode substituí-lo para usar um dos tipos padrão C, como suportado Pelo compilador usado para criar o Perl: A partir de 5.14, nenhum destes levanta uma exceção se eles não são suportados em sua plataforma. No entanto, se os avisos estiverem ativados, um aviso da classe de aviso printf é emitido em um sinalizador de conversão não suportado. Se você preferir uma exceção, faça o seguinte: Se você gostaria de saber sobre uma dependência de versão antes de começar a executar o programa, coloque algo como isto no topo: Você pode descobrir se o seu Perl suporta quads via Config: (Efg EFG), os números normalmente são assumidos como sendo o tamanho padrão flutuante em sua plataforma (duplo ou duplo longo), mas você pode forçar o duplo longo com q. L. ou ll se sua plataforma os suportar. Você pode descobrir se o seu Perl suporta duplicações longas via Config: Você pode descobrir se Perl considera longo duplo para ser o tamanho de ponto flutuante padrão para usar em sua plataforma via Config: Também pode ser que duplos e duplos são os mesmos Coisa: O especificador de tamanho V não tem efeito para código Perl, mas é compatível com compatibilidade com código XS. Significa usar o tamanho padrão para um inteiro Perl ou número de ponto flutuante, que é o padrão. Normalmente, sprintf leva o próximo argumento não utilizado como o valor para formatar para cada especificação de formato. Se a especificação de formato usa para exigir argumentos adicionais, eles são consumidos da lista de argumentos na ordem em que aparecem na especificação de formato antes do valor para formatar. Quando um argumento é especificado por um índice explícito, isso não afeta a ordem normal dos argumentos, mesmo quando o índice explicitamente especificado teria sido o próximo argumento. Usa a para a largura, b para a precisão e c como o valor para formatar enquanto: usaria a para a largura e precisão eb como o valor para formatar. Aqui estão alguns exemplos mais ao estar ciente de que ao usar um índice explícito, pode precisar escapar: Se usar localidade (incluindo o uso de localidade 39: notcharacters39) está em vigor e POSIX :: setlocale foi chamado, o caractere usado para o separador decimal em Os números de ponto flutuante formatados são afetados pela localidade LCNUMERIC. Ver perllocale e POSIX. Ponto de Flutuação Thomas Finley, Abril de 2000 Conteúdo e Introdução Este documento explica o padrão de ponto flutuante IEEE 754. Ele explica a representação binária desses números, como converter para decimal de ponto flutuante, como converter de ponto flutuante para decimal, discute casos especiais em ponto flutuante e, finalmente, termina com algum código C para outros entendimento de ponto flutuante. Este documento não abrange operações com números de ponto flutuante. Eu escrevi este documento para que, se você sabe como representar, você pode ignorar a seção de representação, e se você sabe como converter para decimal de precisão única, você pode ignorar essa seção, e se você sabe como converter para precisão única de Decimal, você pode pular essa seção. Representação Primeiro, saiba que os números binários podem ter, se você perdoar o meu dizendo assim, um ponto decimal. Ele funciona mais ou menos da mesma maneira que o ponto decimal faz com números decimais. Por exemplo, o decimal 22.589 é apenas 22 e 510-1 810 -2 910 -3. Similarmente, o número binário 101.001 é simplesmente 12 2 02 1 12 0 02 -1 02 -2 12 -3. Ou melhor, simplesmente 2 2 2 0 2 -3 (este número específico funciona para ser 9.125, se isso ajuda o seu pensamento). Segundo, saiba que números binários, como números decimais, podem ser representados em notação científica. Por exemplo. O decimal 923.52 pode ser representado como 9.2352 10 2. Da mesma forma, números binários podem ser expressos dessa forma também. Digamos que temos o número binário 101011.101 (que é 43.625). Isso seria representado usando notação científica como 1,01011101 2 5. Agora que tenho certeza de que a compreensão é perfeita, posso finalmente entrar em representação. A unidade de ponto flutuante de precisão simples é um pacote de 32 bits, dividido em três seções um bit, oito bits e vinte e três bits, nessa ordem. Eu vou fazer uso do número binário mencionado anteriormente 1.01011101 2 5 para ilustrar como um tomaria um número binário em notação científica e representá-lo em notação de ponto flutuante. Se convertemos simplesmente de hex para binário, 0x64 é 0110 0100, que é o mesmo resultado que o 011001 produzido acima. Este método é muito mais rápido. De qualquer forma Pegamos os números que temos e os representamos como .011001, colocando-os na ordem em que os adquirimos. Colocado em sequência com a nossa representação binária de 329, obtemos 101001001.011001. Em nossa notação científica binária, isto é 1.01001001011001 2 8. Então usamos o que sabemos sobre como números de precisão simples são representados para completar este processo. O sinal é positivo, então o campo do sinal é 0. O expoente é 8. 8 127 135, então o campo do expoente é 10000111. A mantissa é meramente 01001001011001 (lembre-se o implícito 1 da mantissa significa que não incluímos o líder 1) mais Entretanto muitos 0s nós temos que adicionar ao lado direito para fazer esse número binário 23 bocados por muito tempo. Uma vez que um dos problemas de lição de casa envolve representar isso como hex, eu vou terminar com um número hexadecimal. Em seguida, quebra-lo em pedaços de quatro bits (já que cada dígito hexadecimal é o equivalente a 4 bits) e, em seguida, converter cada quantidade de quatro bits no dígito hexadecimal correspondente. Assim, em hexadecimal, este número é 0x43A4B200. Números especiais Às vezes, o computador sente a necessidade de apresentar um resultado de um cálculo que reflete que algum erro foi feito. Talvez a magnitude do resultado de um cálculo fosse maior ou menor do que esse formato pareceria ser capaz de suportar. Talvez você tenha tentado dividir por zero. A resposta é que há casos especiais de números de ponto flutuante, especificamente quando o campo de expoente é todo 1 bits (255) ou todos os 0 bits (0). Números desnormalizados Se você tem um campo de expoente que é todos os bits zero, isso é o que é chamado um número desnormalizado. Com o campo do expoente igual a zero, você pensaria que o expoente real seria -127, então este número tomaria a forma de 1.MANTISSA 2 -127 como descrito acima, mas não. Em vez disso, é 0.MANTISSA 2 -126. Observe que o expoente não é mais o valor do campo exponencial menos 127. É simplesmente -126. Observe também que não incluímos mais um bit implícito para a mantissa. Como exemplo, pegue o número de ponto flutuante representado como 0x80280000. Primeiro, converta isso para binário. Nosso bit de sinal é 1, então esse número é negativo. Nosso expoente é 0, então sabemos que este é um número desnormalizado. Nossa mantissa é 0101, o que reflete uma mantissa real de 0,0101 lembre-se de que não incluímos o que antes era um bit implícito para um expoente de zero. Assim, isto significa que temos um número -0,0101 2 2 -126 -0,3125 10 2 -126 -1,25 10 2 -128. Zero Você pode pensar em zero como simplesmente um outro número desnormalizado. Zero é representado por um expoente de zero e uma mantissa de zero. A partir de nossa compreensão dos números desnormalizados, isto se traduz em 02 -126 0. Este bit de sinal pode ser positivo (0) ou negativo (1), levando a um zero positivo ou negativo. Isso não faz muito sentido matematicamente, mas é permitido. Infinito Assim como o caso de todos os bits zero no campo do expoente é um caso especial, assim é o caso de todos os bits. Se o campo do expoente é todos os, ea mantissa é todos os zeros, então este número é um infinito. Pode haver infinitos positivos ou negativos dependendo do bit de sinal. Por exemplo, 0x7F800000 é infinito positivo e 0xFF800000 é infinito negativo. NaN (Not a Number) Essas quantidades especiais têm um campo de expoente de 255 (todos os bits) como o infinito, mas diferem da representação do infinito em que a mantissa contém alguns bits. Não importa onde estão ou quantos deles há, apenas contanto que existam alguns. O bit de sinal parece não ter nenhuma influência nisso. Exemplos desta quantidade especial incluem 0x7FFFFFFF, 0xFF81ABD0, 0x7FAA12F9 e soforth. Resumo de Casos Especiais Um resumo de casos especiais é mostrado na tabela abaixo. É mais ou menos uma cópia da tabela encontrada na página 301 da segunda edição da Computer Organization and Design, a Interface de Software de Hardware por Patterson e Hennessy, o livro didático para Ciência da Computação 104 no semestre da Primavera de 2000. Mesmo que apenas a precisão única tenha sido abordada no texto acima, eu incluo a dupla precisão por razões de completude. Quando, Onde e Onde Não Quando você tem operações como 0/0 ou subtraindo o infinito do infinito (ou alguma outra computação ambígua), você receberá NaN. Quando você divide um número por zero, você terá um infinito. No entanto, a contabilização dessas operações especiais exige algum esforço extra por parte do projetista e pode levar a operações mais lentas, já que mais transistores são utilizados no design de chips. Por esse motivo, às vezes, as CPUs não contabilizam essas operações e, em vez disso, geram uma exceção. Por exemplo, quando eu tento dividir por zero ou fazer operações com infinito, meu computador gera exceções e se recusa a concluir a operação (meu computador tem um processador G3 ou MPC750). Helper Software Se você estiver interessado em investigar mais, eu incluo dois programas para os quais eu fornecer o código C que você pode executar para obter uma maior compreensão de como funciona flutuante e também para verificar o seu trabalho em várias atribuições. Hex 2 Float Este programa aceita como entrada uma quantidade hexadecimal e lê-lo como dados brutos na variável theFloat. Em seguida, o programa emite a representação hexadecimal dos dados no Float (repetindo a entrada) e imprime ao lado dela a quantidade de ponto flutuante que representa. Mostro aqui uma amostra do programa. Observe as quantidades de ponto flutuante de casos especiais (0, infinito e não um número). Para os números desnormalizados mas não nulos, este programa exibirá zero mesmo que o número não seja realmente zero. Se você quiser contornar esse problema, substitua o f na seqüência de formatação da função printf com e, que desativará o número com grande precisão com notação científica. Eu não o tive como e porque eu encontro a notação científica extremamente irritante. Float 2 Hex Esta é uma ligeira modificação do programa Hex 2 Float. A exceção é que ele lê em um número de ponto flutuante. Assim como e saídas a forma hexadecimal mais o número de ponto flutuante. Novamente, eu incluo um exemplo de execução deste programa, confirmando os resultados dos exemplos de problemas que abordamos anteriormente neste texto, juntamente com alguns outros casos simples. Observe a representação hexadecimal de 0,2. E esse é o fim desse capítulo. Thomas Finley 2000Binary Calculator (Quer calcular com operandos decimais Você deve convertê-los primeiro.) Sobre a Calculadora Binária Esta é uma calculadora binária de precisão arbitrária. Pode adicionar. subtrair. multiplicar. Ou dividir dois números binários. Ele pode operar em inteiros muito grandes e valores fracionários muito pequenos 8212 e combinações de ambos. Esta calculadora é, por design, muito simples. Você pode usá-lo para explorar números binários em sua forma mais básica. Ele opera em ldquopurerdquo números binários, não formatos de número de computador como complemento two8217s ou ponto flutuante iEEE binário. Como usar a entrada da calculadora binária Digite um operando em cada caixa. Cada operando deve ser um número positivo ou negativo sem vírgulas ou espaços, não expresso como uma fração, e não em notação científica. valores fracionados são indicados com um ponto de raiz (lsquo. rsquo, não lsquo, rsquo), e os números negativos são prefixados com um sinal de menos (ldquo-rdquo). Selecione uma operação (, 8211, /). Altere o número de bits que deseja exibir no resultado binário, se diferente do padrão (isso se aplica somente à divisão e, em seguida, somente quando a resposta tiver uma parte fracionária infinita). Clique em lsquoCalculatersquo para executar a operação. Clique em lsquoClearrsquo para redefinir o formulário e começar do zero. Se você quiser mudar um operando, basta digitar sobre o número original e clicar em lsquoCalculatersquo 8212 não é necessário clicar primeiro em lsquoClearrsquo. Da mesma forma, você pode alterar o operador e manter os operandos como está. Saída Além do resultado da operação, o número de dígitos nos operandos eo resultado é exibido. Por exemplo, ao calcular 1.1101 111.100011 1101.1010110111, a caixa ldquoNum Digitsrdquo exibe ldquo1.4 3.6 4.10rdquo. Isto significa que, operando 1 tem um dígito em sua parte inteira e quatro dígitos em sua parte fracionária, operando 2 tem três dígitos em sua parte inteira e seis dígitos em sua parte fracionária, eo resultado tem quatro dígitos do seu parte inteira e dez dígitos Em sua parte fracionária. A adição, subtração e multiplicação produzem sempre um resultado finito, mas a divisão pode (na verdade, na maioria dos casos) produzir um valor fracionário infinito (repetitivo). Os resultados infinitos são truncados 8212 não arredondados 8212 para o número especificado de bits. Os resultados infinitos são anotados com uma elipse (8230) anexada ao resultado, e com um símbolo lsquo8734rsquo como o número de dígitos fracionários. Para divisões que representam frações diádicas. O resultado será finito e exibido com precisão total 8212 independentemente da configuração para o número de bits fracionários. Por exemplo, 1/1010 para 24 bits fracionários é 0,0001100110011001100110018230, com ldquoNum Digitsrdquo ldquo1.0 / 4.0 0.8734rdquo 11/100 0,11, com ldquoNum Digitsrdquo ldquo2.0 / 3.0 0.2rdquo. Usando a calculadora para explorar aritmética de ponto flutuante Embora essa calculadora implemente aritmética binária pura, você pode usá-la para explorar a aritmética de ponto flutuante. Por exemplo, digamos que você queria saber por que, usando aritmética binária de ponto flutuante de precisão dupla IEEE, 129.95 10 1.299,5, mas 129.95 100 12994.999999999998181010596454143524169921875. Há duas fontes de imprecisão nesse cálculo: conversão decimal em ponto flutuante. E aritmética binária de precisão limitada. Decimal a conversão de ponto flutuante introduz inexato porque um operando decimal pode não ter um exato ponto flutuante equivalente de precisão limitada aritmética binária introduz inexato porque um cálculo binário pode produzir mais bits do que pode ser armazenado. Nestes casos, ocorre o arredondamento. 10 e 100 (ambos os decimais) têm equivalentes de ponto flutuante exato (1010 e 1100100, respectivamente), mas 129,95 tem apenas uma representação aproximada. Meu decimal ao conversor de binário vai dizer-lhe que, em binário puro, 129.95 tem uma fração infinita repetição: 10000001.111100110011001100110011001100110011001100110 011 8230 arredondado para o 53 bits de precisão dupla, it8217s que é 129,94999999999998863131622783839702606201171875 em decimal. 129,95 10 129,95 10 é calculado como o que equivale a 10100010011.011111111111111111111111111111111111111111 1 Este é de 54 bits significativos longos, por isso, quando it8217s arredondado para 53 bits que ele se torna 129,95 100 129,95 100 é calculado como o que equivale a 11001011000010.111111111111111111111111111111111111111 011 Esta é de 56 bits significativos longa, por isso, quando it8217s arredondado para 53 bits torna-se o que é igual a 12994.999999999998181010596454143524169921875 Discussão Para trabalhar com este exemplo, você tinha que agir como um computador, tão tedioso como era. Primeiro, você tinha que converter os operandos para binário, arredondando-os se necessário, então, você tinha que multiplicá-los, e arredondar o resultado. Limites Por razões práticas, o tamanho das entradas 8212 e o número de bits fracionários num resultado de divisão infinita 8212 é limitado. Se exceder estes limites, receberá uma mensagem de erro. Mas dentro desses limites, todos os resultados serão precisos (no caso de divisão, resultados são precisos através da posição pouco truncada).Decimal de ponto flutuante Converter Sobre o Decimal de ponto flutuante Converter Este é um decimal para ponto flutuante binário conversor. Ele converterá um número decimal para o número de ponto flutuante binário IEEE 754 de precisão única e precisão dupla mais próximo, usando o arredondamento redondo-meio-a-par (o modo de arredondamento IEEE padrão). Ele é implementado com aritmética de precisão arbitrária, portanto suas conversões são arredondadas corretamente. Converte os números normais e subnormais, e converterá os números que transbordam (para o infinito) ou underflow (para zero). O número de ponto flutuante resultante pode ser exibido em dez formas: em decimal, em binário, em notação científica decimal normalizada, em notação científica binário normalizado, como um normalizadas vezes decimais uma potência de dois, como um decimal vezes inteiros uma potência de dois , Como um inteiro decimal vezes uma potência de dez, como uma constante de ponto flutuante hexadecimal, em binário bruto e em hexadecimal bruto. Cada formulário representa o valor exato do número de ponto flutuante. Por que usar este conversor Este conversor irá mostrar-lhe por que números em seus programas de computador, como 0,1, não se comportam como você esperaria. Dentro do computador, a maioria dos números com um ponto decimal só pode ser aproximado de outro número, apenas um pouco mais longe do que você quer, deve estar em para ele. Por exemplo, em ponto flutuante de precisão simples, 0.1 torna-se 0.100000001490116119384765625. Se o seu programa está imprimindo 0.1, ele está mentindo para você se ele está imprimindo 0.100000001, it8217s ainda está mentindo, mas pelo menos it8217s dizendo que você realmente don8217t tem 0.1. Como Utilizar esta Entrada do Conversor Introduza um número positivo ou negativo, quer na forma padrão (por exemplo, 134.45) ou expoente (por exemplo, 1.3445e2). Indique valores fracionários com um ponto decimal (lsquo. rsquo) e não use vírgulas. Essencialmente, você pode digitar o que um programa de computador aceita como um literal de ponto flutuante, exceto sem qualquer sufixo (como lsquofrsquo). Verifique as caixas para a precisão IEEE que você quer escolher duplo. solteiro . ou ambos. (Duplo é o padrão.) Duplo significa um significando de 53 bits (menos se subnormal) com um expoente de 11 bits único significa um significando de 24 bits (menos se subnormal) com um expoente de 8 bits. Marque as caixas para qualquer formato de saída que você deseja escolher um ou todos os dez. (Decimal é o padrão.) Clique em lsquoConvertrsquo para converter. Clique em lsquoClearrsquo para redefinir o formulário e começar do zero. Se você quiser converter outro número, basta digitar sobre o número original e clicar em lsquoConvertrsquo 8212 não é necessário clicar primeiro em lsquoClearrsquo. Saída Existem dez formulários de saída para escolher: Decimal. Exibir o número de ponto flutuante em decimal. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Binário. Exibir o número de ponto flutuante em binário. (Expandir a caixa de saída, se necessário, para ver todos os dígitos.) Notação científica decimal normalizada. Exibir o número de ponto flutuante em decimal, mas de forma compacta, usando a notação científica normalizada. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Normalizado binário notação científica. Exibir o número de ponto flutuante em binário, mas de forma compacta, usando a notação científica binária normalizada. Nota . Números subnormais são mostrados normalizados, com seu expoente real. Números decimais normalizados uma potência de dois. Exibir o número de ponto flutuante em uma notação científica normalizada híbrida, como um número decimal normalizado vezes uma potência de dois. Decimal inteiro vezes um poder de dois. Exibir o número de ponto flutuante como um inteiro decimal vezes uma potência de dois. (A representação binária do inteiro decimal é o padrão de bits da representação de ponto flutuante, menos zeros à direita.) Esta forma é mais interessante para expoentes negativos, uma vez que representa o número de ponto flutuante como uma fração diádica. Decimal inteiro vezes um poder de dez. Exibir o número de ponto flutuante como um inteiro decimal vezes uma potência de dez. Esta forma é muito interessante para expoentes negativos, uma vez que representa o número de ponto flutuante como uma fração. (Expandir caixa de saída, se necessário, para ver todos os dígitos.) Hexadecimal ponto flutuante constante. Exibir o número de ponto flutuante como uma constante de ponto flutuante hexadecimal. Nota . Há muitas maneiras de formatar as constantes hexadecimais de ponto flutuante, como você veria se, por exemplo, você comparasse a saída dos programas Java, Visual C, gcc C e Python. As diferenças em várias línguas são superficiais, embora 8212 zeros à direita podem ou não ser mostrados, expoentes positivos podem ou não ter um sinal de mais, etc. Este conversor formata as constantes sem zeros à direita e sem sinais de adição. Nota . Como muitas linguagens de programação, este conversor mostra números subnormais não normalizados, com seus expoentes definidos para o expoente normal mínimo. Nota . O último dígito hexadecimal em uma constante de ponto flutuante hexadecimal pode ter 0s binários à direita dentro desse doesn8217t necessariamente implica que esses bits existem no formato IEEE selecionado. Binário bruto. Exibir o número de ponto flutuante em seu formato IEEE bruto (bit de sinal seguido pelo campo exponente seguido pelo campo significand). Formato hexadecimal bruto. Exibe o número de ponto flutuante no formato IEEE bruto, equivalente ao formato binário bruto, mas expresso de forma compacta em hexadecimal. (Veja aqui para mais detalhes sobre estes formulários de saída.) Existem dois sinalizadores de saída: Inexact. Se marcada, isso mostra que a conversão foi inexata, ou seja, ela teve que ser arredondada para uma aproximação do número de entrada. (A conversão é inexata quando a saída decimal não corresponde à entrada decimal, mas esta é uma maneira mais rápida de dizer.) Observação. Este conversor sinaliza estouro para infinito e underflow para zero como inexata. Subnormal. Se marcado, isso mostra que o número era muito pequeno e convertido com menos de precisão total (a precisão real é mostrada entre parênteses). Implementação Eu escrevi este conversor a partir do zero 8212 ele não depende de funções de conversão nativas como strtod () ou strtof () ou printf (). Baseia-se no algoritmo baseado em números inteiros que descrevo no meu artigo ldquoCorrect Decimal To Floating-Point Usando Big Integers rdquo. I8217ve implementado usando BCMath. Limites Por razões práticas, Ive definir um arbitrário (um pouco) limite sobre o comprimento da entrada decimal you8217ll obter uma mensagem de erro se você acertá-lo. Isso filtra os insumos que, de outra forma, iriam transbordar para o infinito ou subfluxo para zero, mas também impedirá que você entre em alguns casos de arredondamento de ldquohardrdquo. (Para o registro, porém, este conversor aceita todos os exemplos difíceis discutidos no meu site.) Para todas as entradas que são aceitas no entanto, a saída está correta (não obstante quaisquer bugs escapar meu extenso teste).

No comments:

Post a Comment