Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Usualmente, manipulamos números em máquina por meio de suas representações em registros com bits. Ao longo desta seção, usamos a seguinte notação
| (1.23) |
para representar um registro de -bits , .
Na sequência, fazemos uma breve discussão sobre as formas comumente usadas para a manipulação de números em computadores.
Usamos o sistema de complemento de 2 para manipular números inteiros em computadores. Nessa representação, um registro de bits
| (1.24) |
representa o número inteiro
| (1.25) |
O registro de 8 bits2228 bits = 1 byte [B].
| (1.26) |
representa o número
| (1.27) | |||
| (1.28) | |||
| (1.29) |
Podemos implementar um conversor de registro para número inteiro como segue
Com essa função, convertemos uma lista de bits (registro) no inteiro correspondente à representação em complemento de 2.
3
Na representação de complemento de 2 com bits, o menor e o maior números inteiros são obtidos com os registros
| (1.30) | |||
| (1.31) |
respectivamente. Já o zero é obtido com o registro
| (1.32) |
Com um registro de -bits, temos que o menor e o maior números inteiros que podem ser representados são
| (1.33) |
e
| (1.34) |
respectivamente.
Usando o Código 1, temos
-128
127
0
No NumPy, o dtype=numpy.int8 corresponde a inteiros de 8 bits.
array([-127, 0, 3, -128, -127], dtype=int8)
Podemos consultar a lista de tipos básicos do NumPy em NumPy:Data types.
A adição de números inteiros na representação de complemento de 2 pode ser feita de maneira simples. Por exemplo, consideremos a soma usando registros de 8 bits. Temos
| (1.35) | ||||
| (1.36) | ||||
| (1.37) | ||||
| (1.38) |
No sistema de complemento de 2, a representação de um número negativo pode ser obtida da representação de , invertendo seus bits e somando 1. Por exemplo, a representação de pode ser obtida da representação de , como segue
| (1.39) |
Invertendo seus bits e somando 1, obtemos
| (1.40) |
A subtração de números inteiros usando a representação de complemento de 2 fica, então, tanto simples quanto a adição. Por exemplo:
| (1.41) | ||||
| (1.42) | ||||
| (1.43) | ||||
| (1.44) |
Em computadores, manipulamos números reais comumente por meio da representação de ponto flutuante de 64 bits333Padrão IEEE 754.. Nela, um registro de 64 bits
| (1.45) |
representa o número
| (1.46) |
em que chamamos de mantissa e de característica, definidas por
| (1.47) | ||||
| (1.48) |
Por exemplo, na representação em ponto flutuante de 64 bits, temos que o registro
| (1.49) |
representa o número .
A seguinte função converte uma lista de 64 bits no número decimal correspondente, supondo que o registro represente um número normalizado finito.
Por exemplo, usando-a para o registro acima, obtemos
-3.25
Dado um número real , sua representação em ponto flutuante é o registro que representa o número mais próximo de . Este procedimento é chamado de arredondamento por proximidade.
Podemos usar a função a seguir para obter a representação em ponto flutuante de 64 bits de um dado número 444Esta função não é precisa e pode fornecer registros errados devido a erros de arredondamento. Uma alternativa melhor é apresentada na Observação 1.2.2..
Por exemplo, é representado pelo registro
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0]
que corresponde ao número
1.10000000000000008881784197 0012523233890533447265625
O erro de arredondamento é .
O seguinte código é uma solução mais pythônica para obter-se o registro em ponto flutuante de 64 bits de .
’0011111111110001 1001100110011001 1001100110011001 1001100110011010’
Recomendamos consultar [4] para mais informações sobre a conversão eficiente de números decimais em pontos flutuantes.
Observamos que o erro de arredondamento varia conforme o número dado e pode ser zero quando . Para caracterizar a precisão do sistema, usamos o épsilon de máquina, definido como a distância entre o número 1 e seu primeiro sucessor em ponto flutuante. Portanto, ele não representa o erro de arredondamento de todo número. Temos
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2.220446049250313e-16
Ou seja, o épsilon de máquina é
| (1.50) |
O método numpy.finfo pode ser usado para obtermos várias informações sobre o sistema de números em ponto flutuante. Por exemplo, temos
2.220446049250313e-16
-1.7976931348623157e+308
1.7976931348623157e+308
A aritmética em ponto flutuante requer arredondamentos sucessivos de números. Por exemplo, a computação da soma de dois números dados e é feita a partir de suas representações em ponto flutuante e . Então, computa-se e o resultado é . Observe, inclusive que pode ser diferente de . Por exemplo
False
Vamos fornecer, no sistema de complemento de 2 de 8 bits, os registros que representam os seguintes números inteiros:
1
-1
15
-15
Com a função a seguir, obtemos o registro em complemento de 2 de 8 bits que representa um dado número inteiro .
Usando-a, obtemos os seguintes resultados:
[1, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 0, 0, 0, 0]
[1, 0, 0, 0, 1, 1, 1, 1]
Vamos determinar o menor número positivo representável em ponto flutuante de 64 bits e fornecer seu registro.
Um registro em ponto flutuante de 64-bits tem a forma
| (1.51) |
e representa o número
| (1.52) |
onde é chamada de mantissa e da característica, as quais são definidas por
| (1.53) | ||||
| (1.54) |
A expressão acima descreve números normalizados. No padrão IEEE 754, também representamos números subnormais: para característica e mantissa , temos . O registro totalmente nulo representa o zero.
Assim, o menor número positivo representável é subnormal: usamos , e mantissa . Logo,
| (1.55) | |||
| (1.56) |
Seu registro é
| (1.57) |
O resultado pode ser verificado com os seguintes comandos:
5e-324
’0000000000000000 0000000000000000 0000000000000000 ’0000000000000001’
Em aplicações que não necessitam de muita precisão, a representação de números decimais no sistema de ponto flutuante de 32 bits é mais eficiente (no sentido de velocidade de processamento computacional). Neste sistema, um registro de 32-bits
| (1.58) |
representa o número
| (1.59) |
onde,
| (1.60) | |||
| (1.61) |
Forneça o registro do ponto flutuante de 32-bits que representa o número .
Qual é o sucessor de 1 em ponto flutuante de 32-bits. Forneça, também, o épsilon de máquina deste sistema.
O registro do ponto flutuante de 32-bits que representa o número pode ser computado com o seguinte código:
[0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Alternativamente, pode-se obter o registro como segue:
’0100001000101010 0000000000000000’
No sistema de ponto flutuante de 32-bits, o sucessor de 1 tem o registro
| (1.62) |
donde, sua mantissa é , característica e corresponde ao número decimal
| (1.63) | |||
| (1.64) |
Portanto, o épsilon de máquina neste sistema é
| (1.65) | |||
| (1.66) |
1.1920929e-07
Considerando a representação de complemento de 2 de números inteiros, obtenha os registros de bits dos seguintes números:
a) [10001000]; b) [11110111]
c) [00000100]; d) [00000111]
Considerando a representação de complemento de 2 de números inteiros, obtenha os registros de -bits dos seguintes números:
a) [0000000000100000];
b) [0000000000111111];
Considerando a representação de complemento de 2 de números inteiros, qual é o maior número que pode ser representado por um registro de -bits da forma
| (1.67) |
onde , .
Obtenha os registros em ponto flutuante de -bits dos seguintes números:
a) ;
b)
Assumindo o sistema de ponto flutuante de -bits, obtenha o registro e o erro de arredondamento na representação dos seguintes números decimais:
[0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]
[0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0]
[0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]
Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.