Floating-point numbers · Números de ponto flutuante
| English | Português |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | ponto flutuante |
| mantissa/mænˈtɪsə/ | mantissa |
| exponent/ekˈspəʊnənt/ | expoente |
| normalised/ˈnɔːməlaɪzd/ | normalizado |
| precision/prɪˈsɪʒn/ | precisão |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | erros de arredondamento |
| fixed-point/fɪkst pɔɪnt/ | ponto fixo |
| overflow/ˌəʊvəˈfləʊ/ | overflow |
| underflow/ˌʌndəˈfləʊ/ | underflow (estouro negativo) |
A missile that missed by 600 metres
- On 25 February 1991 a Patriot battery at Dhahran failed to intercept an incoming missile. Twenty-eight soldiers died.
- The system counted time in tenths of a second, and 0.1 has no exact binary representation: it is a repeating fraction, truncated to the register's width. Each tick lost a fraction of a microsecond.
- After a hundred hours running, the accumulated error was a third of a second, and in a third of a second the target moved 600 metres. The arithmetic was correct at every single step.
- This lesson is the floating-point 浮点 format, normalisation 规格化, and the approximation errors that make cases like this possible.
Um míssil que errou por 600 metros
- Em 25 de fevereiro de 1991, uma bateria Patriot em Dhahran falhou em interceptar um míssil incoming. Vinte e oito soldados morreram.
- O sistema contava o tempo em décimos de segundo, e 0.1 não tem representação binária exata: é uma fração periódica, truncada à largura do registro. Cada tick perdeu uma fração de microsegundo.
- Após cem horas rodando, o erro acumulado foi um terço de segundo, e em um terço de segundo o alvo se moveu 600 metros. A aritmética estava correta em cada passo único.
- Esta lição é sobre o formato floating-point 浮点, normalização 规格化, e os erros de aproximação que tornam casos como este possíveis.
The format
- To store real numbers of very different sizes, a computer uses a binary form of scientific notation with two fields: a mantissa 尾数, the significant digits, and an exponent 指数, the power of 2 to multiply by. Both are stored as two's complement.
- Read the mantissa as a binary fraction: the first bit after the point is worth $\tfrac12$, the next $\tfrac14$, then $\tfrac18$. So
0.1010000is $\tfrac12 + \tfrac18 = 0.625$. - With exponent
00000010, that is $+2$, the value is $0.625 \times 2^2 = 2.5$.
A fraction and a power of two
O formato
- Para armazenar números reais de tamanhos muito diferentes, um computador usa uma forma binária de notação científica com dois campos: uma mantissa 尾数, os dígitos significativos, e um exponente 指数, a potência de 2 para multiplicar. Ambos são armazenados como complemento a dois.
- Leia a mantissa como uma fração binária: o primeiro bit após o ponto vale $\tfrac12$, o próximo $\tfrac14$, depois $\tfrac18$. Então
0.1010000é $\tfrac12 + \tfrac18 = 0.625$. - Com exponente
00000010, isso é $+2$, o valor é $0.625 \times 2^2 = 2.5$.

Uma fração e uma potência de dois
Build a floating-point number · Construir um número de ponto flutuante
Flip the mantissa and exponent bits to make a value, and check whether it is normalised. · Inverter os bits da mantissa e do expoente para formar um valor e verificar se está normalizado.
A floating-point number is stored as: · Um número de ponto flutuante é armazenado como:
value = mantissa × 2^exponent — binary scientific notation, with both parts stored in two's complement. · valor = mantissa × 2^expoente — notação científica binária, com ambas as partes armazenadas em complemento de dois.
Match each part of floating-point representation to its role. · Combine cada parte da representação de ponto flutuante com sua função.
value = mantissa × 2^exponent; normalising maximises precision; money uses fixed-point/BCD to avoid rounding. · valor = mantissa × 2^expoente; a normalização maximiza a precisão; dinheiro usa ponto fixo/BCD para evitar arredondamentos.
Worked example: binary to denary
- A number has mantissa
10110000and exponent00000011. Find its denary value. - The exponent is $+3$. The mantissa begins with 1, so it is negative and is read by two's complement rules: as
1.0110000the sign bit is worth $-1$ and the fraction bits add $\tfrac14 + \tfrac18 = 0.375$, so the mantissa is $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- The commonest error is reading a negative mantissa as if it were positive. Check the first bit before anything else.
Exemplo resolvido: binário para decimal
- Um número tem mantissa
10110000e expoente00000011. Encontre seu valor decimal. - O exponente é $+3$. A mantissa começa com 1, então é negativo e é lido pelas regras do complemento a dois: como
1.0110000o bit de sinal vale $-1$ e os bits de fração somam $\tfrac14 + \tfrac18 = 0.375$, então a mantissa é $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- O erro mais comum é ler uma mantissa negativa como se fosse positiva. Verifique o primeiro bit antes de qualquer outra coisa.
A floating-point number has mantissa 10110000 and exponent 00000011. What is its denary value? · Um número de ponto flutuante tem mantissa 10110000 e expoente 00000011. Qual é seu valor decimal?
The mantissa starts with 1, so it is negative: −1 + 1/4 + 1/8 = −0.625. Times 2^3 gives −5.0. Reading it as positive is the usual error. · A mantissa começa com 1, portanto é negativa: −1 + 1/4 + 1/8 = −0.625. Multiplicado por 2^3 resulta em −5.0. Lê-la como positiva é o erro comum.
Worked example: denary to binary
- Store $+2.5$ in the same 8-bit mantissa, 8-bit exponent format.
- In binary, $2.5 = 10.1$. Written as a fraction times a power of two: $2.5 = 0.101 \times 2^2$.
- So the mantissa is
01010000, a sign bit of 0 then.101padded with zeros, and the exponent is00000010. - Always write it in the normalised form first; then the two fields read straight off.
Exemplo resolvido: decimal para binário
- Armazene $+2.5$ no mesmo formato de mantissa de 8 bits, exponente de 8 bits.
- Em binário, $2.5 = 10.1$. Escrito como uma fração vezes uma potência de dois: $2.5 = 0.101 \times 2^2$.
- Então a mantissa é
01010000, um bit de sinal de 0 então.101preenchido com zeros, e o exponente é00000010. - Sempre escreva primeiro na forma normalizada; então os dois campos lêm direito fora.
Written as a normalised fraction times a power of two, 2.5 = 0.101 x 2^. Give the exponent. · Escrita como uma fração normalizada vezes uma potência de dois, 2.5 = 0.101 x 2^. Dê o expoente.
2.5 is 10.1 in binary; sliding the point two places left gives 0.101, so the exponent is 2 and the mantissa is 01010000. · 2.5 é 10.1 em binário; deslizar a vírgula duas casas para a esquerda dá 0.101, então o expoente é 2 e a mantissa é 01010000.
Normalisation
- A number is normalised when the first significant bit sits immediately after the binary point, so there are no wasted leading zeros. For a positive number the mantissa starts
0.1; for a negative one,1.0. - Why: it maximises precision 精度, because every mantissa bit then carries information rather than a leading zero.
- To normalise, shift the mantissa left and decrease the exponent by the same number of places, or shift right and increase it. The value is unchanged; only its representation is.
Shift the bits, adjust the exponent, keep the value
Normalização
- Um número é normalizado quando o primeiro bit significativo fica imediatamente após o ponto binário, então não há zeros à esquerda desperdiçados. Para um número positivo a mantissa começa
0.1; para um negativo,1.0. - Por quê: ele maximiza a precisão 精度, porque cada bit da mantissa carrega informação em vez de um zero à esquerda.
- Para normalizar, desloque a mantissa para a esquerda e diminua o expoente no mesmo número de posições, ou desloque para a direita e aumente-o. O valor permanece inalterado; apenas a sua representação muda.

Desloque os bits, ajuste o expoente, mantenha o valor
Trading mantissa bits against exponent bits
- The total number of bits is fixed, so the two fields compete.
- More mantissa bits means greater precision: each value is stored more exactly, with a smaller rounding error.
- More exponent bits means greater range: much larger and much smaller magnitudes can be represented, but each one less precisely.
- A question asking for the effect of moving a bit from one field to the other wants exactly this trade: range against precision.
Troca de bits da mantissa por bits do expoente
- O número total de bits é fixo, pelo que os dois campos competem entre si.
- Mais bits de mantissa significam maior precisão: cada valor é armazenado com mais exatidão, com um erro de arredondamento menor.
- Mais bits de expoente significam maior intervalo: magnitudes muito maiores e muito menores podem ser representadas, mas cada uma com menos precisão.
- Uma pergunta sobre o efeito de mover um bit de um campo para o outro pretende exatamente esta troca: intervalo contra precisão.
Normalising a floating-point number · Normalizando um número de ponto flutuante
Step through normalisation. Shifting the mantissa to remove wasted leading zeros — and adjusting the exponent to match — keeps the value the same but spends every bit on precision. · Passos da normalização. Deslocar a mantissa para remover zeros à esquerda desperdiçados — e ajustar o expoente correspondentemente — mantém o valor inalterado, mas utiliza cada bit para precisão.
Normalising a floating-point number: · Normalizando um número de ponto flutuante:
Normalisation shifts the mantissa so the first significant bit follows the point — every bit then carries information, and the value is unchanged. · A normalização desloca a mantissa para que o primeiro bit significativo siga a vírgula — todos os bits carregam informação e o valor permanece inalterado.
Which are true of normalising a floating-point number? Select all · todos that apply. · Quais são verdadeiras sobre a normalização de um número de ponto flutuante? Selecione todas as opções.
Normalising changes only the representation. The value is unchanged; that is what adjusting the exponent guarantees. · A normalização altera apenas a representação. O valor é inalterado; isso é garantido pelo ajuste do expoente.
Approximation and its consequences
- Many denary reals cannot be stored exactly in binary. $0.1$ is the repeating fraction $0.000110011\ldots$, so it must be truncated: the stored value is close to $0.1$ but never equal to it.
- Rounding errors 舍入误差 accumulate over many operations, which is why
0.1 + 0.2is not exactly0.3and why the Patriot's clock drifted. - So never test two reals for equality: write
ABS(x - 0.3) < 1e-9instead ofx = 0.3. And beware subtracting two nearly equal values, which throws away most of the significant digits. - For values that must be exact, currency above all, use fixed-point 定点 or BCD instead.
Aproximação e suas consequências
- Muitos números reais decimais não podem ser armazenados exatamente em binário. $0.1$ é a fração periódica $0.000110011\ldots$, logo deve ser truncada: o valor armazenado está próximo de $0.1$, mas nunca igual a ele.
- Erros de arredondamento 舍入误差 acumulam-se ao longo de muitas operações, razão pela qual
0.1 + 0.2não é exatamente0.3e porque o relógio do Patriot derivou. - Então nunca teste dois reais para igualdade: escreva
ABS(x - 0.3) < 1e-9em vez dex = 0.3. E cuidado ao subtrair dois valores quase iguais, o que elimina a maioria dos dígitos significativos. - Para valores que devem ser exatos, principalmente moedas, use ponto fixo 定点 ou BCD em vez disso.
Match each change in the bit allocation to its effect. · Combine cada alteração na alocação de bits com seu efeito.
The word size is fixed, so precision and range trade against each other; overflow and underflow are the exponent field running out at each end. · O tamanho da palavra é fixo, então precisão e intervalo trocam entre si; overflow e underflow ocorrem quando o campo do expoente esgota em cada extremidade.
Overflow and underflow
- Overflow 溢出 happens when a result is too large for the exponent's range, so it cannot be represented at all.
- Underflow 下溢 happens when a result is too small, so close to zero that the exponent cannot go low enough, and it rounds to zero.
- Both are properties of the exponent field's size, which is the other half of the trade-off above.
Transbordamento e subtransbordamento
- Transbordamento 溢出 ocorre quando um resultado é demasiado grande para o intervalo do expoente, pelo que não pode ser representado de forma alguma.
- Subtransbordamento 下溢 ocorre quando um resultado é demasiado pequeno, tão próximo de zero que o expoente não pode descer o suficiente, e arredonda-se para zero.
- Ambos são propriedades do tamanho do campo do expoente, que é a outra metade da troca acima.
0.1 cannot be stored exactly in binary (it is a repeating fraction), so 0.1 + 0.2 does not give exactly 0.3 on a computer. · 0.1 não pode ser armazenado exatamente em binário (é uma fração periódica), então 0.1 + 0.2 não resulta exatamente em 0.3 no computador.
The tiny approximation errors add up — which is why money is handled with fixed-point or BCD, not floating-point. · Os pequenos erros de aproximação somam-se — é por isso que o dinheiro é tratado com ponto fixo ou BCD, não com ponto flutuante.
For exact money calculations you should use: · Para cálculos monetários exatos você deve usar:
Floating-point rounding errors are unacceptable for currency; fixed-point or BCD store decimal values exactly. · Erros de arredondamento de ponto flutuante são inaceitáveis para moeda; ponto fixo ou BCD armazena valores decimais exatamente.
Marks that slip away
- The mantissa is a fraction, not an integer: the first bit after the point is a half.
- A mantissa starting with 1 is negative and follows two's complement rules. Check that bit first.
- Normalisation maximises precision; it does not change the value, and it does not make the number bigger.
- More mantissa means precision, more exponent means range. Overflow is too big, underflow is too small.
Marcas que escapam
- A mantissa é uma fração, não um inteiro: o primeiro bit após a vírgula representa meio.
- Uma mantissa que começa com 1 é negativa e segue as regras de complemento de dois. Verifique esse bit primeiro.
- A normalização maximiza a precisão; não altera o valor e não torna o número maior.
- Mais mantissa significa precisão, mais expoente significa alcance. Estouro é muito grande, subfluxo é muito pequeno.
You've got it
- floating point stores $\text{mantissa} \times 2^{\text{exponent}}$, both in two's complement; the mantissa is a binary fraction
- convert by reading the mantissa as a fraction (two's complement if it starts with 1) and multiplying by two to the exponent
- normalised means the first significant bit is immediately after the point, which maximises precision; shifting left lowers the exponent
- more mantissa bits give precision, more exponent bits give range; binary cannot store many reals exactly, so expect rounding errors, compare with a tolerance, and use fixed-point or BCD for currency
Entendeu?
- O ponto flutuante armazena $\text{mantissa} \times 2^{\text{exponent}}$, tanto em complemento de dois; a mantissa é uma fração binária
- Converta lendo a mantissa como uma fração (complemento de dois se começar com 1) e multiplicando por dois elevado ao expoente
- Normalizado significa que o primeiro bit significativo está imediatamente após a vírgula, o que maximiza a precisão; deslocar para a esquerda diminui o expoente
- Mais bits de mantissa dão precisão, mais bits de expoente dão intervalo; binário não pode armazenar muitos reais exatamente, portanto espere erros de arredondamento, compare com uma tolerância e use ponto fixo ou BCD para moedas