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]
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!