Artigo: 126455 - Última revisão: terça-feira, 9 de Dezembro de 2003 - Revisão: 2.0

Como evitar arredondamento & sobrecarga Probs no processadores Pentium

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Intel Corporation identificou dois erros secundários de um processador Pentium relacionadas com a conversão de valores de ponto flutuante para números inteiros quando utilizar a instrução FIST (flutuante ponto inteiro arquivo). Estes erros envolvem o processamento de excepções para uma variedade de limites para números de vírgula flutuante estreita e envolvem um comportamento inesperado em dois modos de arredondamentos para seis operandos específicos. Os programadores podem facilmente trabalhar à volta do primeiro erro pelo intervalo de verificação antes de converter os valores. Os programadores podem evitar o erro segundo por não substituir a predefinição arredondamento modos.

Mais Informação

Diferentes linguagens de programação processam conversões de vírgula flutuante para número inteiro de formas diferentes. Programas C, C++ e FORTRAN são provavelmente seguros; ou seja, não são susceptíveis a ser afectados sem modificações explícita de modos de arredondamento pelo programador. Programas básicos serão mais provável ser afectada por erros.

Os programas de aplicação em geral não são afectados. Aplicações devem incluir a verificação de erros adequado e efectuar acções adequadas para recuperar de excepções. Para efectuar este procedimento, aplicações necessário fazer explícito intervalo verificar antes da conversão ou implementar o processamento de excepções explícito. Se uma aplicação depender de processamento de excepções explícito, existe a possibilidade de ocorrência de erros. As aplicações escritas em idiomas que utilizam o processamento de excepções utilizará provavelmente intervalo de verificação, permitindo assim aos aplicação a ser compilada com uma opção de não verificação por razões de desempenho.

Descrição geral do FIST

A instrução FIST é utilizada para converter números de vírgula flutuante para números inteiros assinados. Por exemplo, num programa de C ou FORTRAN, quando uma variável de número inteiro é atribuída um ponto flutuante valor, que o valor deve ser truncado para um número inteiro antes de ser armazenado. Também são possíveis outras conversões de flutuante ponto a número inteiro; por exemplo, Basic e Pascal arredondar em vez de truncar a parte fraccional.

A instrução FIST funciona num de quatro modos de arredondamentos: Corte (também conhecido como truncagem), mais próximo (mais próximo ou par), cima e para baixo. As predefinição tipo conversões C e FORTRAN utilizam corte arredondamento modo, enquanto que Basic utiliza mais próximo. O processador indica se o operando de entrada é um número inteiro através de um sinalizador de excepção (PE) de precisão. O sinalizador PE está definido como true se o número para ser convertida já não for um número inteiro; ou seja, que tinha uma parte fraccional. -Caso contrário, permanece inalterado. O efeito de arredondamento é mostrado no arredondamento sinalizador de direcção (C1). Se um valor de entrada é arredondado para um número com um maior magnitude, está definido o sinalizador de C1; caso contrário, está desmarcada.

FIST converte números de vírgula flutuante 16, 32 ou 64-bit inteiros assinados. Uma vez que o intervalo de um flutuante aponte número é maior que destes formatos, alguns números de vírgula flutuante não pode ser convertido para números inteiros. Por exemplo, o maior inteiro de 16 bits é 32767, para que tentar converter um número inteiro de 16 bits 32768.5 resulta numa excepção (neste caso, a excepção de operação inválida (IE)). O processamento de uma excepção é controlado pela máscara de excepção no flutuante aponte o registo de controlo. Se for definida uma máscara de excepção de operação inválida, a excepção é mascarada, caso contrário, é unmasked.

Por exemplo, as aplicações em execução no Microsoft Windows versão 3.1 começar com excepções de ponto flutuante tudo mascaradas. Aplicações diferentes podem alterar as máscaras de excepção e fornecer os seus próprios métodos para o processamento de excepções. Por exemplo Microsoft Visual C++ define a excepção de operação inválida para unmasked, mantendo a excepção de precisão mascarada. Uma aplicação desenvolvida em C++ será apresentada uma janela pop-up são apresentadas quando uma instrução FIST tenta converter um número que está fora dos limites, a menos que o processamento de excepções é alterado.

Capacidade excedida não detectada

Foi identificado um erro pela Intel nas instruções de FIST converter um flutuante ponto número para qualquer um 16 ou 32-bit inteiro. A instrução FISTP que armazena um número inteiro de 64 bits não é afectada. O erro ocorre quando o modo de arredondamento é definido "mais próximo" ou "cópia" de um intervalo limitado de flutuante valores de ponto no limite da região de limites. Para este intervalo, independentemente da máscara de excepção, o valor 0 é escrito para a memória, o sinalizador PE estiver definido, o sinalizador do Internet Explorer não está definido e não excepção IE é accionada.

Em números abaixo, flutuante valores de ponto de A e B pode ser convertido para números inteiros. Valores fora deste intervalo devem originar uma excepção. Este erro afecta os valores do intervalo C e D apenas.

FIST de 16 bits
                                                 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, são um número fora do intervalo de um 32-bit assinado inteiro, como, por exemplo, 4,294,967,295.7. Este é arredondado matematicamente 4,294,967,296. Devido a erros, o processador Pentium não acciona uma excepção a este número. Basta escreve um 0 na memória e não transfere o controlo a uma rotina de tratamento de nem elevar o sinalizador do Internet Explorer.

Aplicações que utilizam o Microsoft Visual Basic

Microsoft Visual Basic aumenta automaticamente tipos de dados para lidar com operações de tipo misto. Isto evita a condição de excesso para a maior parte dos casos. Por exemplo:
   IntX = SngY*IntZ
   IntX = 65535.7*2
				

No entanto, poderão ser afectadas conversões implícitas. O seguinte código de versão 3.0 do Visual Basic produz resultados diferentes consoante o processador:
   Dim X As Integer
   Dim Y As Single
   Y = 65535.5
   X = Y
   MsgBox Cstr(X)
				

O código anterior deve resultar numa mensagem "Sobrecarga" run-time error 6. Num computador com processador Pentium, este código resulta numa devolução de zero (0). Uma forma simples para evitar este erro é incluir uma verificação de intervalo no seu código. Por exemplo:
   If (x)>=65535.5
   Then Error 6
				

Os programas apenas afectados seria aqueles que explicitamente aplica um véu erro 6 (área de excesso) e envolver uma atribuição explícita de uma expressão de vírgula flutuante para um tipo de dados número inteiro ou um tipo de dados longo ou conversão explícita de um flutuante aponte expressão utilizando CInt() ou CLng().

Programas que utilizam limites explícitos verificação para impedir condições de excesso não serão afectados.

Se verificar negativamente limites afecta o desempenho num ciclo, migrar o código para uma biblioteca de ligação dinâmica linguagem C (DLL) poderá ser a melhor opção.

Resultados de programa

Ao nível da assemblagem, a solução recomendada é a inserção da instrução FRNDINT (flutuante ponto arredondado ao número inteiro) imediatamente antes a instrução FIST. FRNDINT será correctamente redondas a flutuante aponte valor antes de executar a instrução FIST (em oposição a FISTP); a correcção também necessita de manter a respectiva entrada. Versões futuras do Visual Basic inclui esta correcção.

NOTA: Qualquer método que força o processador para emular instruções de ponto flutuante evitará o problema, no valor de desempenho reduzido e velocidade.

Modo de erros de arredondamento

Para seis operandos específicos, os resultados das instruções FIST não são conforme esperado. Existem diferenças de sinalizador em todos os quatro modos de arredondamentos. Também existe a possibilidade de um número incorrecto de ser armazenado na "até" e "premido" modos de arredondamento. "Mais próximo" e "divisao" arredondamento modos, que são frequentemente utilizados, o valor armazenado para a memória está correcto. Este erro afecta 16-, 32 e 64-bit variantes da instrução.

A tabela seguinte mostra os números afectados, arredondamento modos e valores reais e esperados:
   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 incorrectos. Em todos os modos de arredondamentos, o sinalizador PE não está definido consistente com o arredondamento ocorrida; permanece inalterada. Para os três números positivos no modo de arredondamento "cópia", FIST armazena um valor incorrecto (0 em vez de 1); do mesmo modo, para os três números negativos no modo de arredondamento "para baixo", FIST dá um resultado incorrecto (0 em vez de -1). Em cada um destes casos, o bit de C1 também não está definido correctamente. No entanto, nas "mais próximo" e "divisao" modos de arredondamento, o valor armazenado para a memória é sempre correcto, tal como o bit de C1.

Resultados de programa

Só são devolvidos resultados incorrectos de erro segundo quando o modo de arredondamento é definido como "cópia"ou "baixo". Por conseguinte, não deve afectar uma aplicação a menos que a aplicação altere explicitamente o modo de arredondamento da predefinição de idioma. Se uma aplicação alterações "cópia" ou "premido" modo de arredondamento, pode já não dependem de funcionalidades de idioma fornecidos conversão floating-point-valor-para--número inteiro e tem de fornecer as suas próprias, por exemplo, utilizando FRNDINT.

As informações de um estado incorrecto o sinalizador PE, que afecta todos os modos de arredondamento, deve ser não significativos na maioria das aplicações. Se haverá arredondamento, já está definido o sinalizador PE. A excepção de PE também normalmente com máscara. O bit de C1 só é utilizado por um processador de excepções, pelo que os valores incorrectos são insignificantes.

Solução

Ao nível da assemblagem a solução recomendada para o segundo erro FIST é o mesmo para o primeiro; inserir a instrução FRNDINT imediatamente antes a instrução FIST.

Os programadores de aplicações podem evitar erros no segundo o erro de arredondamento por não substituir a predefinição arredondamento modos.

NOTA: Qualquer método que força o processador para emular instruções de ponto flutuante evitará ambos os problemas no valor de desempenho reduzido e velocidade.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
Palavras-chave: 
kbmt KB126455 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.