Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Usualmente, números são manipulados em máquina através de suas representações em registros com -bits. Ao longo desta seção, vamos usar a seguinte notação
| (1.30) | 
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.
O sistema de complemento de 2 é utilizado em computadores para a manipulação de números inteiros. Nesta representação, um registro de bits
| (1.31) | 
representa o número inteiro
| (1.32) | 
O registro de 8 bits22endnote: 28 bits = 1 byte [B].
| (1.33) | 
representa o número
| (1.34) | ||||
| (1.35) | ||||
| (1.36) | 
Podemos implementar um conversor de registro para número inteiro como segue
Esta função, converte uma lista de bits (registro) no inteiro corresponde ao sistema de complemento 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.37) | |||
| (1.38) | 
respectivamente. Já o zero é obtido com o registro
| (1.39) | 
Com um registro de -bits, temos que o menor e o maior números inteiros que podem ser representados são
| (1.40) | |||
| (1.41) | 
e
| (1.42) | |||
| (1.43) | 
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)
Consulte 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.44) | ||||
| (1.45) | ||||
| (1.46) | ||||
| (1.47) | 
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.48) | 
Invertendo seus bits e somando 1, obtemos
| (1.49) | 
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.50) | ||||
| (1.51) | ||||
| (1.52) | ||||
| (1.53) | 
A manipulação de números decimais em computadores é comumente realizada usando a representação de ponto flutuante de 64 bits33endnote: 3Padrão IEEE 754.. Nesta, um dado registro de 64 bits
| (1.54) | 
representa o número
| (1.55) | 
onde é chamada de mantissa e da característica, as quais são definidas por
| (1.56) | ||||
| (1.57) | 
Por exemplo, na representação em ponto flutuante de 64 bits, temos que o registro
| (1.58) | 
representa o número .
A seguinte função faz a conversão uma lista de 64 bits no número decimal corresponde ao sistema de ponto flutuante de 64 bits.
Por exemplo, usando-a para o registro acima, obtemos
-3.5
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.
A seguinte função obtém a representação em ponto flutuante de 64 bits de um dado número 44endnote: 4Esta 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 pythonica 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.
Observemos que o erro de arredondamento varia conforme o número dado, podendo ser zero no caso de . Comumente, utiliza-se o épsilon de máquina como uma aproximação desse erro. O épsilon de máquina é definido como a distância entre o número 1 e seu primeiro sucessor em ponto flutuante. 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.59) | 
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
No sistema de complemento 2 de 8 bits, forneça o registro que representa os seguintes números inteiros:
1
-1
15
-15
A seguinte função, obtém o registro de complemento 2 de 8-bits de um dado número inteiro x.
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]
Qual é o número decimal positivo mais próximo de zero que pode ser representado como um ponto flutuante de 64-bits. Também, forneça seu registro.
Um registro em ponto flutuante de 64-bits tem a forma
| (1.60) | 
e representa o número
| (1.61) | 
onde é chamada de mantissa e da característica, as quais são definidas por
| (1.62) | ||||
| (1.63) | 
Tendo em vista que o registro nulo é reservado para o número decimal zero, temos que o número positivo mais próximo de zero é obtido com sinal , a mantissa e a característica , no que obtemos o decimal
| (1.64) | ||||
| (1.65) | 
Seu registro é
| (1.66) | 
O resultado pode ser verificado com os seguintes comandos:
2.2250738585072014e-308
’0000000000010000 0000000000000000 0000000000000000 0000000000000000’
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.67) | 
representa o número
| (1.68) | 
onde,
| (1.69) | |||
| (1.70) | 
Forneça o registro do ponto flutuante de 32-bits que representa o número .
Qual é o sucessor em ponto flutuante de 32-bits do número decimal 1. 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.71) | 
donde, sua mantissa é , característica e corresponde ao número decimal
| (1.72) | |||
| (1.73) | 
Portanto, o épsilon de máquina neste sistema é
| (1.74) | ||||
| (1.75) | 
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.76) | 
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.