Artigo: 42980 - Última revisão: terça-feira, 16 de Agosto de 2005 - Revisão: 3.1 (Concluir) Iniciação ler IEEE Floating-Point erros
Nesta páginaSumárioMatemática de vírgula flutuante é um tópico complexo que confuses Muitos programadores. Iniciação abaixo deverão ajudá-lo reconhecer programação situações onde é provável que ocorrem erros de vírgula flutuante e como evitar esses. Deve também permitem-lhe reconhecer casos são causados por limitações inerentes matemático de vírgula flutuante por oposição a erros de compilador real. Mais InformaçãoDecimal binário número de sistemas eNormalmente, é contar elementos em base 10. A base é completamente arbitrária. O único motivo que pessoas utilizaram tradicionalmente base 10 é que têm 10 dedos, que efectuou úteis ferramentas de contagens.O número 532.25 em decimal (base 10) significa o seguinte:
(5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
500 + 30 + 2 + 2/10 + 5/100
_________
= 532.25
No sistema de número binário (base 2), cada coluna representa uma potência de 2 em vez de 10. Por exemplo, o número 101.01 significa o seguinte:
(1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
4 + 0 + 1 + 0 + 1/4
_________
= 5.25 Decimal
Como números inteiros estão representados no PCPorque não existe nenhuma parte fraccional para um número inteiro, respectiva representação do computador é muito mais simples do que para valores de vírgula flutuante. Números inteiros normais em computadores pessoais (PCs) são 2 bytes (16 bits) tempo com o bit mais significativo indicando o sinal. Números inteiros longos são 4 bytes. Valores positivos são simples números binários. Por exemplo:
1 Decimal = 1 Binary
2 Decimal = 10 Binary
22 Decimal = 10110 Binary, etc.
No entanto, números inteiros negativos são representados utilizando das duas esquema complemento. Para obter das duas complemento representação para um número negativo, efectuar representação binária para absoluto valor o número e inverter todos os bits e adicione 1. Por exemplo:
4 Decimal = 0000 0000 0000 0100
1111 1111 1111 1011 Flip the Bits
-4 = 1111 1111 1111 1100 Add 1
Tenha em atenção que-1 decimal = 1111 1111 1111 1111 em binário, que explica porque Basic trata-1 como true lógico (todos os bits = 1). Esta é uma consequência da não ter operadores separados para comparações lógicas e ao nível do bit. Muitas vezes no Basic, é conveniente utilizar o fragmento de código abaixo quando o programa a efectuar comparações lógicas muitos. Isto ajuda significativamente legibilidade. CONST TRUE = -1 CONST FALSE = NOT TRUE Note que adicionar qualquer combinação do dois complementar números em conjunto utilizando normal aritmética binária produz o resultado correcto. Problemas no que respeita à floating-PointCada número inteiro decimal pode ser exactamente representado por um número inteiro binário; no entanto, isto não é verdadeiro para números com fracções. De facto, cada número irrational em base 10 também estará irrational em qualquer sistema com uma base mais pequeno do que 10.Para binário, em particular, apenas fraccionais números que podem ser representados no formulário p/q, q sendo uma potência de número inteiro de 2, podem ser expressa exactamente, com um número finito de bits. Fracções decimais mesmo comuns, tais como decimal 0,0001, não pode ser representadas exactamente em binário. (0,0001 é uma fracção binária repetição com um período de 104 bits!) Isto explica o motivo pelo qual um exemplo simples, tais como os seguintes
SUM = 0
FOR I% = 1 TO 10000
SUM = SUM + 0.0001
NEXT I%
PRINT SUM ' Theoretically = 1.0.
irá PRINT 1.000054 como saída. O pequeno erro no representando 0,0001 em binário é propagado para a soma. Pela mesma razão, deverá sempre ser bastante cuidadoso ao efectuar comparações nos números de real. O exemplo seguinte ilustra um erro de programação comum: item1# = 69.82# item2# = 69.20# + 0.62# IF item1# = item2# then print "Equality!" Isto não irá PRINT "Igualdade!" porque 69.82 não podem ser representadas exactamente em binário, que faz com que o valor que resulta da atribuição ser LIGEIRAMENTE diferente (em binário) que o valor é gerado a partir da expressão. Na prática, deve sempre de código tais comparações de tal forma, para permitir alguns tolerância. Por exemplo: IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal" Isto irá PRINT "Igual". IEEE Formatar númerosQuickBasic para MS-DOS, versão 3.0 foi enviada com uma versão MBF (Microsoft binário flutuantes pontos) e uma versão de IEEE (Institute of Electrical and Electronics Engineers) para computadores com um coprocessador matemático. QuickBasic para MS-DOS, versões 4.0 e posteriores só utilizam IEEE. Microsoft escolheu a norma IEEE para representar valores vírgula flutuante de versões actuais do Basic pelas seguintes razões principais três:
Sign Bits Exponent Bits Mantissa Bits
--------- ------------- -------------
IEEE 1 11 52 + 1 (Implied)
MBF 1 8 56
Para obter mais informações sobre as diferenças entre IEEE e MBF, representação vírgula flutuante, de consulta de base de dados de conhecimento do Microsoft as seguintes palavras: IEEE and floating and point and appnote Note que o IEEE tem mais bits dedicados à expoente, o que permite representar um intervalo maior de valores. MBF tem mais bits mantissa, que permite que seja mais precisos respectivo intervalo mais estreita. Conceitos de Floating-Point geraisÉ muito importante que compreenda que qualquer sistema de vírgula flutuante binário pode representar apenas um número finito de vírgula flutuante valores no formato exacto. Todos os outros valores tem de ser aproximados pelo valor representáveis mais próximo. A norma IEEE especifica o método de arredondamento de valores para o valor representáveis "mais próximo". QuickBasic para MS-DOS suporta o padrão e arredonda acordo com para as regras de IEEE.Além disso, tenha em atenção que os números que podem ser representados em IEEE são repartidos muito grande intervalo. Pode imagine uma linha de número. Existe uma alta densidade dos números representáveis perto 1.0 e-1.0 mas menos e menos que vá para 0 ou infinito. O objectivo da norma IEEE, que foi concebido para cálculos de engenharia é maximizar a precisão (para obter fechar possíveis para a número). Precisão refere-se ao número de dígitos que pode representar. O IEEE padrão tenta equilibrar o número de bits dedicadas para o expoente com o número de bits utilizado para a parte fraccional do número, para manter a exactidão e precisão dentro de limites aceitáveis. Detalhes de IEEENúmeros de vírgula flutuante são representados no seguinte formato, onde [expoente] é o expoente binário:X = Fraction * 2^(exponent - bias) [Fracção] é a parte fraccional normalizada do número, normalizada porque o expoente é ajustado para que o bit à esquerda é sempre um 1. Desta forma, não é necessário ser armazenadas e obter um pouco mais de precisão. É por isso não existe um bit implícito. Pode considerar este como notação científica, onde manipular o expoente tenham um dígito à esquerda da vírgula decimal, excepto no binário, sempre possível manipular o expoente para que o primeiro bit seja um 1, uma vez que existem apenas 1s e 0s. [compensação] é o valor de compensação utilizado para evitar ter de armazenar expoentes negativos. A compensação para números de precisão simples é 127 e 1023 (decimal) para números de precisão dupla. Os valores iguais para todos os zeros e todos os 1 (binário) são reservados para representando casos especiais. Existem alguns outros casos especiais, que indicam a várias condições de erro. Exemplos de precisão simples2 = 1 * 2 ^ 1 = 0100 0000 0000 a 0000... 0000 0000 = 4000 0000 hexNota o bit de sinal é zero e o expoente armazenado é 0 0000 128 ou 100 em binário, que é 127 mais 1. A mantissa armazenada é (1). 000 0000... 0000 0000 tem um espaçamento implícito 1 e binário apontar, por isso a mantissa real é 1. Entre -2 =-1 * 2 ^ 1 = 1100 0000 0000 a 0000... 0000 0000 = C000 0000 hex Mesmo que + 2, excepto que o bit de início de sessão é definido. Isto acontece para IEEE de todas as formatar números de vírgula flutuante. 4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... 0000 0000 = 4080 0000 hex Mesmo mantissa, expoente aumenta em um (valor polarizado é 129 ou 100 1 0000 em binário. 6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex Expoente mesmo, mantissa é maior por meio--é 100 (1)... 0000 0000 0000, que, uma vez que esta é uma fracção binária, 1-1/2 (os valores de dígitos fraccionais são 1/2, 1/4, 1/8, etc..). 1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex Expoente mesmo como outros poderes de 2, mantissa é um inferior a 2 em 127 ou 011 1111 1 em binário. 0,75 = 1.5 * 2 ^-1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex O expoente polarizado é 126, 011 1111 binário em 0 e a mantissa é 100 (1)... 0000 0000 0000, 1-1/2. 2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... 0000 0000 = 4020 0000 hex Exactamente o mesmo 2 excepto que o bit que representa 1/4 é definido na mantissa. 1.6 = 0,1 * 2 ^ Desde -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex 1/10 seja uma fracção repetição em binário. É apenas shy de 1.6 a mantissa e o expoente polarizado indica que 1.6 deve ser dividida por 16 (é 011 1101 1 em binário, 123 em decimal). O expoente VERDADEIRO é 127 123 = - 4, o que significa que o factor pelo qual multiplicar é 2 ** desde -4 = 1/16. Note que o último bit é arredondada a mantissa armazenada. Esta é uma tentativa para representar o número unrepresentable com precisão possível. (O motivo que 1/10 e 1/100 são não exactamente representáveis em binário é semelhante da forma que é não exactamente representáveis no formato decimal 1/3.) 0 = 1.0 * 2 ^-128 = zeros--um caso especial. Outros erros Floating-Point comunsSeguem-se erros de vírgula flutuante comuns:
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 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: 42980
(http://support.microsoft.com/kb/42980/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções de Artigos
|






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



Voltar ao topo