ID do artigo: 126455 - Última revisão: terça-feira, 9 de dezembro de 2003 - Revisão: 2.0 Como evitar arredondamento & Probs estouro em processadores Pentium
Nesta páginaSumárioIntel Corporation identificou dois pequenos bugs no processador Pentium relacionadas à conversão de valores de ponto flutuante para números inteiros ao usar a instrução de armazenamento de inteiro flutuante ponto (primeiro). Esses bugs envolvem o processamento de exceções para um intervalo estreito dos limites para números em ponto flutuante e envolvem um comportamento inesperado em dois modos arredondamento para seis operandos específicos. Os programadores podem facilmente contornar o bug primeiro intervalo de verificação antes de converter os valores. Os programadores podem evitar o segundo bug não sobrescrevendo o padrão arredondamento modos. Mais InformaçõesLinguagens de programação diferentes tratam conversões de ponto flutuante para inteiros de maneiras diferentes. Programas C, C++ e FORTRAN são provavelmente seguros; ou seja, eles não são podem ser afetados sem modificações explícitas de arredondamento modos pelo programador. Programas básicos provavelmente pode ser afetado pelos bugs mais. Programas aplicativos em geral não são afetados. Aplicativos devem incluir a verificação de erros apropriado e tome ações apropriadas para recuperar de exceções. Para fazer isso, aplicativos precisem fazer explícito intervalo de verificação antes da conversão ou implementar manipulação de exceção explícita. Se um aplicativo depende de manipulação de exceção explícita, existe a possibilidade de encontrar o erro. Aplicativos escritos em idiomas que usam o tratamento de exceção provavelmente usará o intervalo de verificação, permitindo que o aplicativo ser compilado com uma opção de não-seleção por motivos de desempenho. Visão geral do primeiroA instrução primeiro é usada para converter números em ponto flutuante para inteiros assinados. Por exemplo, em um programa C ou FORTRAN, quando uma variável inteiro é atribuída a um ponto flutuante valor, que o valor deve ser truncado para um número inteiro antes de serem armazenados. Também são possíveis outras conversões de número inteiro de ponto flutuante; por exemplo, Basic e Pascal arredondar em vez de truncar a parte fracionária.A instrução primeiro opera em um dos quatro modos arredondamento: corte (também conhecido como truncamento), mais próximo (mais próximo ou até mesmo), superiores e inferiores. As padrão tipo conversões por C e FORTRAN usam o corte arredondamento modo, enquanto Basic usa mais próximo. O processador indica se o operando de entrada é um número inteiro por meio de um sinalizador de exceção (PE) de precisão. O sinalizador PE é definido como true se o número a ser convertido já não era um número inteiro; ou seja, que tinha uma parte fracionária. Ele permanece inalterado caso contrário. O efeito de arredondamento é mostrado no sinalizador de direção (C1) arredondamento. Se um valor de entrada é arredondado para um número com uma magnitude maior, o sinalizador C1 é definido; caso contrário, ela está desmarcada. PRIMEIRO converte números em ponto flutuante para 16, 32 ou 64 bits assinados inteiros. Porque o intervalo de um flutuante aponte número for maior que qualquer um dos seguintes formatos de alguns números em ponto flutuante não pode ser convertido em inteiros. Por exemplo, o maior inteiro de 16 bits é 32767, portanto, uma tentativa de converter 32768.5 para um número inteiro de 16 bits resulta em uma exceção (nesse caso, a exceção de operação inválida (IE)). O processamento de exceção é controlado pela máscara de exceção a flutuante aponte o registro de controle. Se for definida uma máscara de exceção de operação inválida, a exceção é mascarada, caso contrário, ele é sem máscara. Por exemplo, aplicativos em execução no Microsoft Windows versão 3.1 começam com exceções de ponto flutuante todos os mascarados. Aplicativos diferentes podem alterar as máscaras de exceção e fornecer seus próprios métodos para tratamento de exceções. Por exemplo Microsoft Visual C++ define a exceção de operação inválida revelados, deixando a exceção de precisão mascarada. Um aplicativo desenvolvido em C++ será exibida uma janela pop-up aparecem quando uma instrução primeiro tenta converter um número que esteja fora dos limites, a menos que a manipulação de exceção é alterada. Estouro não detectadoUm bug foi identificado pela Intel no primeiro instruções que convertem um flutuante inteiro de número de ponto para qualquer um de 16 ou 32 bits. A instrução FISTP que armazena como um inteiro de 64 bits não é afetada. O erro ocorre quando um modo de arredondamento é definido como "próximo" ou "backup" para um intervalo limitado de flutuante valores de ponto de saída da região de limites. Para esse intervalo, independentemente da máscara de exceção, o valor 0 é gravado para a memória, o sinalizador PE é definido, o sinalizador IE não está definido e nenhuma exceção IE é gerada.Nas figuras abaixo, flutuante valores de ponto de A e B pode ser convertido para números inteiros. Valores fora desse intervalo devem gerar uma exceção. Esse bug afeta valores no C e D intervalo somente. 16-Bits primeiro
65535.5 -
-32768.5 0 32767.5 65536.0
<-------------[--------|--------]-------------------|-------->
overflow Normal Range overflow
A B C
32-Bit FIST
4,294,967,295.5 -
-2,147,483,648.5 0 2,147,483,647.5 4,294,967,296.0
<-------------[------------|------------]-----------------------|-------->
overflow Normal Range overflow
A B D
Por exemplo, dê um número fora do intervalo de um inteiro assinado de 32 bits, como 4,294,967,295.7. Isso é arredondado matematicamente a 4.294.967.296. Devido a erro, o processador Pentium não dispara uma exceção a este número. Ele simplesmente grava um 0 na memória e não transfere o controle a um manipulador ou aumentar o sinalizador do IE. Aplicativos que usam Microsoft Visual BasicMicrosoft Visual Basic promove automaticamente tipos de dados para manipular operações tipo misto. Isso evita a condição de estouro para muitos casos. Por exemplo:No entanto, podem ser afetadas conversões implícitas. O seguinte código de versão 3.0 do Visual Basic produz resultados diferentes dependendo do processador: O código acima deve resultar em uma mensagem de "Estouro" Erro em tempo de execução 6. Em um computador com processador Pentium, esse código resulta em um retorno de zero (0). Uma maneira simples de evitar esse erro é incluir uma verificação de intervalo em seu código. Por exemplo: Os únicos programas afetados poderiam ser aqueles que explicitamente interceptar o erro 6 (estouro de) e envolvem uma atribuição explícita de uma expressão de ponto flutuante para um tipo de dados inteiro ou um tipo de dados Long ou conversão explícita de um flutuante aponte expressão usando CInt() ou CLng(). Programas que utilizam a verificação para evitar condições de estouro de limites explícitos não devem ser afetados. Se negativamente verificação de limites afeta o desempenho em um loop, migrando o código para uma biblioteca de vínculo dinâmico (DLL) do linguagem C pode ser uma opção melhor. Resultados do programaNo nível do assembly, a solução recomendada é a inserção da instrução FRNDINT (flutuante Ponto redondo como inteiro) imediatamente antes da instrução primeiro. Valor de ponto será FRNDINT corretamente redonda o flutuante antes de executar a instrução primeiro (em oposição a FISTP); a correção será necessário preservar sua entrada. Versões futuras do Visual Basic incluem essa correção.Observação: Qualquer método que força o processador para emular instruções de ponto flutuante será evitar o problema, ao custo de desempenho reduzido e velocidade. Erros de modo de arredondamentoPara seis operandos específicos, os resultados das instruções primeiro não são conforme o esperado. Existem diferenças de sinalizador em todos os quatro modos de arredondamento. Também há a possibilidade de um número incorreto sendo armazenado em "acima" "para baixo" modos de arredondamento. No "mais próximo" e "fragmentação" arredondamento modos, que são usados com mais freqüência, o valor armazenado para a memória está correto. Esse bug afeta 16-, 32 e 64-bit variantes da instrução.A tabela a seguir mostra os números afetados, arredondamento modos e valores esperados e reais:
Operand | Rounding | Exp. | Actual | Exp. | Actual | Exp. | Actual
(any one of) | mode | mode | mode | PE | PE | C1 | C1
-----------------------------------------------------------------------
1/16 (0.0625) | nearest | 0 | 0 | 1 | unch. | 0 | 0
1/8 (0.125) | chop | 0 | 0 | 1 | unch. | 0 | 0
3/16 (0.1875) | down | 0 | 0 | 1 | unch. | 0 | 0
| up | 1 | 0 | 1 | unch. | 1 | 0
-1/16 (-0.0625)| nearest | 0 | 0 | 1 | unch. | 0 | 0
-1/8 (-0.125) | chop | 0 | 0 | 1 | unch. | 0 | 0
-3/16 (-0.1875)| down | -1 | 0 | 1 | unch. | 1 | 0
| up | 0 | 0 | 1 | unch. | 0 | 0
Para seis números (1/16, 1/8, 16/3,-1/16,-1/8 e-3/16) podem ocorrer resultados incorretos. No arredondamento todos os modos, o sinalizador PE não está definido consistentemente com o arredondamento ocorreu; permanece inalterado. Para os três números positivos no modo de arredondamento "backup", primeiro armazena um valor incorreto (0 em vez de 1); da mesma forma, para três números negativos no modo de arredondamento "para baixo", primeiro retorna um resultado incorreto (0 em vez de -1). Em cada um desses casos, o bit C1 também não está definido corretamente. No entanto, no "mais próximo" e "fragmentação" arredondamento modos, o valor armazenado para a memória é sempre correto, como é o bit C1. Resultados do programaResultados incorretos do segundo bug só são retornados quando o modo de arredondamento é definido como "backup"ou "abaixo". Portanto, ele não deve afetar um aplicativo, a menos que o aplicativo altera explicitamente o modo de arredondamento do idioma padrão. Se um aplicativo alterações "acima" ou "abaixo" modo de arredondamento, ele não pode contar com recursos fornecidos pelo idioma conversão floating-point-valor-para--número inteiro e deve fornecer seu próprio, por exemplo, usando FRNDINT.As informações de status incorreto no sinalizador PE, afetar todos os modos de arredondamento, deve ser insignificante na maioria dos aplicativos. Se o arredondamento, o sinalizador PE já está definido. A exceção PE também normalmente é mascarada. O bit C1 é usado somente por um manipulador de exceção, para que sejam insignificante valores incorretos. Solução alternativaNo nível do assembly a solução recomendada para o segundo bug primeiro é o mesmo para o primeiro; inserir a instrução FRNDINT imediatamente antes da instrução primeiro.Os programadores de aplicativos podem evitar arredondamento erros no bug segundo substituindo não padrão arredondamento modos. Observação: Qualquer método que força o processador para emular instruções de ponto flutuante evitará os dois problemas ao custo de desempenho reduzido e velocidade. A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 126455
(http://support.microsoft.com/kb/126455/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções deste artigo |






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email



Voltar para o início