Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NumPyu e o IEEE 754

NumPyu e o IEEE 754

O Toy System 1 em detalhe, e as representações IEEE 754 Single, Double e Quad. Épsilon, ULP, e o Teorema fundamental da representação IEEE. A função fl com truncamento, dos reais no Toy 1. O teorema fundamental da representação IEEE.
Como a NumPy lida com esses conceitos.

Paulo Bordoni

July 05, 2013
Tweet

More Decks by Paulo Bordoni

Other Decks in Education

Transcript

  1. Auto-retrato Rembrandt H. van Rijn, Holandês, 15 /07/1606– 04/10/1669 A

    Casa de Maurício (de Nassau), na cidade de Haia, na Holanda É A Lição de Anatomia do Dr. Nicolaes Tulp, (1632) . Pintura a óleo de Rembrandt, no Museu Mauritshuis (Casa de Maurício)
  2. Moça com Brinco de Pérola, (1665-1666) Johannes Vermeer, Holandês, 31/10/1632

    – 15/12/1675 O filme é emocionante e a pintura ma-ra-vi-lho-sa. Vejam o olhar dela!
  3. Michelangelo Merisi da Caravaggio, Italiano, 29/09/1571 - 18/071610 Medusa, Pintura

    em madeira, 1596/7 Fui ao MASP, em São Paulo, ver a exposição de Caravaggio. A cabeça da Medusa, com as serpentes, é apavorante. Mas eu não petrifiquei!
  4. San Girolamo , Caravaggio, pintura a óleo sobre tela, com112

    x 157 cm, feita em 1605-1606. Atualmente na Galeria Borghese, Roma. Também vi no MASP. Observem a luz direcionando sua atenção ...
  5. http://masp.art.br/masp2010/ Na ida a São Paulo além do MASP, passeiem

    pela Av. Paulista e procurem as Livrarias. Ouçam a OSESP na Sala São Paulo, apreciem a arquitetura da Catedral da Sé. Almocem no Mercado Municipal, ...
  6. Vincent Van Gogh O escolar (O Filho do Carteiro –

    Gamin au Képi) Pierre-Auguste Renoir Rosa e Azul (As Meninas Cahen d´Anvers) Uma amostra do MASP...
  7. A escolha da pintura A Lição de Anatomia do Dr.

    Nicolaes Tulp para abertura desta lição não é por acaso. É uma indicação artística de que, agora, passaremos a dissecar a representação IEEE 754/2008 em Python/NumPy.
  8. Bem, meus jovens, vamos retornar aos números. Vamos construir um

    sistema numérico de brinquedo, fiel ao padrão IEEE 754/2008. Fala sério, Mestre!
  9. s e f Toy 1 64 números Toy 2 s

    e f 256 números Vamos construir um sistema Toy 1, com 6 bits e um Toy 2 com 8 bits: A única diferença é que o Toy 2 tem uma fração maior, com 4 bits!
  10. -3 000 -2 001 -1 010 0 011 1 100

    2 101 3 110 4 111 Faixa normal Exceção De-normalização e Toy 2 s e f s e f Toy 1 Em ambos, os expoentes possíveis são os 8 abaixo:
  11. s e f Toy 1 00 ....... 0.00 01 .......

    0.25 10 ....... 0.50 11 ....... 0.75 f No Toy 2, são 24 = 16 e no Single são 223 = 8.388.608 frações possíveis No Toy 1 as frações possíveis são as 22 = 4 abaixo:
  12. 0000 .... 0.0000 0001 .... 0.0625 0010 .... 0.1250 0011

    .... 0.1875 0100 .... 0.2500 0101 .... 0.3125 0110 .... 0.3750 0111 .... 0.4375 f Toy 2 s e f 1000 .... 0.5000 1001 .... 0.5625 1010 .... 0.6250 1011 .... 0.6875 1100 .... 0.7500 1101 .... 0.8125 1110 .... 0.8750 1111 .... 0.9375 f As frações doToy 2 são as 16 abaixo:
  13. 000...000  0.0000000 000...001  2-23 000...010  2-22 000...011

     2-23+2-22 .... 011...111  2-2+ ... +2-23 100...000  2-1 100...001  2-1+2-23 .... 111...111  2-1+ ... +2-23 f 23 bits Imagine só as 8.388.608 frações do Single:
  14. (-1)s ∗ 2e-3 ∗ (1.f) ..... se e = 1,2,3,4,5,6

    (-1)s ∗ 2e-2 ∗ (0.f) .... se e = 0 e f ≠ 0 (-1)s ∗ 0 .................... se e = 0 e f = 0 (-1)s ∗ Inf ................ se e = 7 e f = 0 NaN ......................... se e = 7 e f ≠ 0 x = Nos dois padrões Toy a regra de decodificação é quase a mesma. Isto pq. a condicional sobre o expoente é a mesma (eles são iguais!). A diferença reside só nas frações.
  15. Fiz um programa para mostrar os números do Toy 1.

    O Toy 2 ficará por conta de vocês. Vou fazer, Mestre!
  16. Na primeira linha da matriz os de-normalizados. Na última a

    faixa de exceções; o 16. corresponde ao +Inf e 20., 24. e 28. aos NaN. As 6 linhas internas são os nos. normais. E os negativos?
  17. Vou quebrar esse gráfico em dois. Um de y =

    2. para baixo e outro de y = 2. para cima. Tem razão Surfista, é porque para cada grupo de 4 números de Toy 1 o fator de escala muda(*) numa potência de 2: 2-2, 2-2, 2-1, 20, 21, 23 e 24. (*) Exceto na transição dos de-normalizados para a 1ª faixa normal, em que é o mesmo.
  18. O programa que gera a parte inferior do gráfico. Até

    a linha 14 ele é igual ao Toy_1.py.
  19. Valeu, Mestre, inclusive vejo que a escala é a mesma

    para a menor faixa dos normais e a dos de-normalizados
  20. Imaginem se não houvesse sido criada a faixa de de-normalização.

    A distância do menor normal positivo m* à zero seria muito maior que a de m*, ao normal seguinte, causando uma enorme perda de precisão! m*
  21. No Single é a mesma coisa, só que ele é

    dado por 2−127 ∗ (1. ). Com = 1 = 00 … 00, obtemos 1 2126 ≅ 1.1754943508222875 ∗ 10−38 O menor normal positivo noToy 1 é dado por 2−3 ∗ (1. ). Com = 1 = 00, obtemos 1/22 = 0.25.
  22. O programa que gera a parte superior do gráfico do

    Toy 1. Até a linha 14 ele é igual ao Toy 1.py.
  23. Vejam: • o maior normal é 14. • +Inf corresponde

    a 16. • e os NaN a 20., 24. e 28. Show de bola, Mestre, vou fazer o Toy 2.
  24. Exatamente, +∞ ∉ ℝ. E o + faz o papel

    de +∞ no Toy 1 e em todos sistemas IEEE 754. Mestre, aprendi em Cálculo I que ±∞ não são números. Então, pq + = 16 ?
  25. Observe, por exemplo, no Toy 1, que: • 14. +12.

    = 26. > +, • 7.∗ 8. = 56. > +. Então, ao executar um programa, o sistema IEEE 754 informará que essas operações resultam em NaN teremos como evitar uma travada na sua execução! Mestre, então qual a razão dos NaN existirem ?
  26. No Single é a mesma coisa, só que ele é

    dado por 2−127 ∗ 1. . Com = 254 = 11 … 1, obtemos 2128 ∗ (1 + 1/2 + ⋯ + 223) = = 2128 ∗ (224 − 1)/223 = 2105 ∗ (224 − 1) ≅ 6.805646932770577 + 38 O maior normal no Toy 1 é dado por 2−3 ∗ (1. ). Com = 6 = 11 obtemos 23 ∗ (1 + 1/2 + 1/4) = 8 ∗ 7/4 = 14.
  27. Ora 1.11 … 1 2 = 1 + 1/2 +

    1/4 + ⋯ + 1/223. E, prova-se por indução finita em N, que 1 + 1/2 + 1/4 + ⋯ + 1/2 = (2+1 − 1)/2. Mestre, porque 1.11 … 1 2 = (224 − 1)/223 ?
  28. ε Assim o ε no Toy 1 é 1 =

    0.25 = 0.012 Define-se ε (leia épsilon) como “a distância entre 1.0 e o próximo número normal da representação IEEE”
  29. No IEEE Single, o próximo número normal depois do 1.0

    é 1 . 0000 0000 0000 0000 0000 001 Assim = 1 223 ≅ 1.1920928955078125 ∗ 10−7 4 8 12 16 20 23 posição No Toy 2, o 1º número após 1.0 é 1.0001 2 e então 2 = 1/24 = 0.0625.
  30. No IEEE Double, o próximo número normal depois do 1.0

    é 1 . 0000 0000 0000 ... 0000 0000 0001 Assim = 1/252 ≅ 2.220446049250313 ∗ 10−16 4 8 12 44 48 52 posição
  31. A distância entre pontos consecutivos dos sistemas IEEE Toy 1,

    IEEE Single, etc, será sempre um múltiplo de seu ε por uma potência de 2 (o fator de escala). 2ε ε ε/2
  32. ε ULP é uma sigla para unit in the last

    position. A unidade na última posição de , (), para ∈ 1 é o número definido por = 2exp (). Nada mais que o produto do fator de escala de por .
  33. Os sistemas IEEE 754 de ponto flutuante, Single, Double e

    Quad, inclusive os Toy 1 e Toy 2, foram criados para representar números reais no computador. Na realidade para aproximar.
  34. O ato de aproximar, não importa como, terá que ser

    descrito por uma função. Para garantir que a um número não estejam associados dois aproximandos distintos (ou mais). É. Nós, matemáticos, sabemos disso. A ideia que uma causa não pode possuir efeitos diferentes está embutida na definição de função.
  35. Saber que será uma função facilita enormemente a investigação –

    já conseguimos um mapa da mina! Sim. Além da regra de associação, toda função possui um domínio, um contradomínio e um conjunto imagem.
  36. É óbvio que o contradomínio será um dos sistemas de

    representação do IEEE 754, Single, Double, Quad Toy 1 ou Toy 2. E, o domínio, o conjunto ℝ dos números reais. O nome de batismo escolhido para essas funções será de float.
  37. Atenção. A razão de ser dos números, e dos computadores,

    é computar: efetuar as operações aritméticas básicas. Sempre atento Filósofo! Os NaN, + e – não estão no IEEE 754 para efetuarmos continhas com eles.
  38. Os + e – funcionam como divisor de águas. A

    todo ∈ (−∞, −) ∪ (+, +∞) corresponderá um : = . E para ∈ (, +) precisaremos detalhar as regras da associação. ↦ ()
  39. Truncar significa desprezar os dígitos da fração da representação de

    ponto flutuante de a partir de um certo dígito. Uma forma de aproximar um número real , já na base 2 e normalizado, por um número ∗ do IEEE 754 é por truncamento.
  40. Bits do sinal de x Bits do expoente de x

    Bits da fração de x TRUNCAR significa desprezar todos esses bits de x! • Toy 1 ......... 2 bits • Toy 2 ........ 4 bits • Single ....... 23 bits • Double ...... 52 bits • Quad ........ 112 bits A representação binária normalizada de e o nº de bits a manter na fração para obter ∗
  41. Fique esperto Surfista, no truncamento, ∗ é o número de

    Toy 1 entre e zero, não o mais próximo. Idem, ibidem, para os outros sistemas IEEE. ∗ Para ir de para ∗ caminhamos em direção ao zero. Inclusive quando é negativo.
  42. Pois é, no truncamento você sempre “perde” dígitos, mas preste

    atenção no exemplo: Truncando 2.38 obtemos 2.3 e truncando −2.38 obtemos −2.3, ambos mais próximos de zero (Note que −2.3 > −2.38). Assim, ao truncar, você sempre “caminha” em direção ao zero. Mas, se no truncamento “perdemos” dígitos então ∗ ≤ , de forma que ∗ sempre estará a esquerda de .
  43. Surfista, quais são os intervalos correspondentes noToy2, Single, Double e

    Quad ? Os números ∈ ℝ aos quais poderemos associar um NÚMERO ∗ ∈ 1, via truncamento, são aqueles situados no intervalo (−, +). No Toy 1, o intervalo (-16,+16). +Inf
  44. 1.0 1.25 0.75 0.25 0.5 0.62 5 0.0625 0.125 2.5

    2.0 1.75 1.5 0.1875 0.3125 0.375 0.4375 0.87 5 0.0 1.25 0.75 0.25 0.5 0.625 0.0625 0.125 2.5 2.0 1.75 1.5 0.1875 0.3125 0.375 0.4375 0.875 0.0 1.0 Portanto, o gráfico da função ∶ ℝ → 1 é o de uma função escada. Vejam só sua parte inferior: Lá embaixo, os de-normalizados em amarelo.
  45. 16.0 14.0 5.0 12.0 10.0 6.0 7.0 8.0 4.0 20.0

    24.0 3.5 3.0 +Inf 14.0 5.0 12.0 10.0 6.0 7.0 8.0 4.0 NaN 3.5 3.0 A parte superior do gráfico. Vejam o + e o NaN.
  46. Professora, os dois gráficos estão em escalas diferentes, não? 1ª

    figura 2ª figura Sim querida, veja a mudança de escala entre as duas figuras E para ∈ ℝ, ≤ 0, o gráfico de f l é o reflexo desse com relação aos eixos-x e y.
  47. É importante observarmos que exp = exp (∗) quando ∗

    = , porque efetuamos a normalização antes de truncar para obter ∗. Portanto ∗ = ε ∙ exp ∗ = ε ∙ exp = , embora isto possa soar de forma estranha.
  48. ∗ = () ∗ = () Assim, a desigualdade −

    < , é válida para qualquer sistema de ponto flutuante IEEE 754, quando usamos truncamento para ∈ −, + , na faixa normal. Essa desigualdade é óbvia, já que (∗) é a distância entre ∗ e o próximo (oposto ao 0) elemento de Toy 1.
  49. Observem que − < , estabelece um limite superior para

    o erro absoluto cometido ao aproximarmos por , quando ∈ −, + , na faixa normal.
  50. Ora, para ∈ −, + , na faixa normal, temos

    = 1 + () 2exp () ≥ 2exp e portanto: − < () || ≤ 2exp 2exp =
  51. Essa desigualdade dá um limite superior para o erro relativo

    cometido ao aproximarmos por f l (x), quando truncamos. O Mestre acabou de provar que para ∈ −, + , na faixa normal, vale: − || < ℰ , quando usamos truncamento para obter ().
  52. Mestres, esse limitante não depende de – só do do

    sistema IEEE 754. Genial Surfista. Essa tua sacada é tão importante quanto aquele tubo fantástico que te deu o Campeonato Mundial de 2012!
  53. Dado um número real ∈ (−, +), na faixa normal

    de um sistema IEEE 754, então = (1 + ) para algum satisfazendo < , onde é o épsilon desse sistema, quando usamos truncamento. Dela deduzimos o importantíssimo Teorema fundamental da representação de ponto flutuante IEEE 754
  54. 0 − () Claro, pois de − < , é

    imediato que existe δ ∈ −ε, para o qual () − = , isto é: = (1 + ).
  55. De fato, o padrão IEEE 754 estabelece quatro possíveis funções

    de aproximação ∶ ℝ → ( ) ↦ ∗ = () Nome da função ∗ aproxima por truncamento arredondamento ↑ em direção a +∞ ↓ em direção a −∞
  56. Bits do sinal de Bits do expoente de Bits da

    fração de Bit de arredon- damento de Na aproximação ∗ de por arredondamento, ∗ = (), o papel do bit + 1 de , é fundamental. bits
  57. A aproximação ∗ = () é definida por ∗ =

    = 0 + 1 = 1 (∗) onde: • 1 = 0.00 ⋯ 01 (1 na última posição da fração); • o bit na posição + 1 de , dito bit de arredondamento ∗ − eventualmente será necessário renormalizar ∗.
  58. Mestres, na prática, como esses conceitos sobre floats aparecem em

    Python e na NumPy? Vamos pedir ajuda ao Manoel, Loirinha.
  59. Floats estão entre os tipos pré-definidos básicos em Python. Vamos

    ao “Built-in Types” da Biblioteca Padrão de Python.
  60. No finalzinho do Tutorial de Python são apontados problemas e

    limitações com a aritmética de ponto flutuante. Não deixem de ler!
  61. Na próxima aula, vamos analisar com muito mais detalhe os

    consequências do erro de representação nas operações algébricas. Esse é um dos pontos básicos do Cálculo Numérico.
  62. Conforme veremos ao longo do Curso, existem diversas razões para

    não utilizar a opção base 10 em Computação Científica.
  63. Mestres, me sinto perdida! Como faço para buscar informação sobre

    esses assuntos no Numpy? Bem, Loirinha, vou pedir à Professora para te ajudar. Ela tem mais paciência!
  64. Essa é a hierarquia de tipos no NumPy. Nosso foco,

    no momento, está assinalado em vermelho.
  65. Números “reais” em ponto flutuante e números complexos em ponto

    flutuante. Os dois grupos assinalados são específicos de NumPy.
  66. O programinha a seguir recebe um decimal, via teclado e

    devolve suas representações binárias IEEE 754/2008 em: • Half (via numpy.float16) • Single (via numpy.float32) • Double (via nump.float64) Na formatação de saída forçamos 16 dígitos após a vírgula para exibir os erros inerentes ao processo.
  67. O simples ato de entrar com um número, via teclado,

    causa erro de representação decimal. Para Single em mais de 99.99% dos casos.
  68. Acontecerá algo parecido no Single e no Double? Que horror!

    Mestre, no float16, os 31 números: 65489, 65480, ... , 65519 retornam o mesmo valor, 65504. E o 65520 retorna +inf.
  69. Usaremos o float16 para evidenciar, de forma gritante, a propagação

    do erro no cálculo de funções. Aguardem! Vou voltar no tempo, lá para a Magna Grécia, nos 400 AC. Desisto de apoiar os cursos desse Professor. Lá usamos ábacos – são mais confiáveis que esses computadores.
  70. Mestres, continuo angustiada! Existe alguma outra forma de buscar informação

    sobre esses assuntos no Numpy sem ter que que olhar o Manuel todinho – da 1ª à última página??? Bem Loirinha, resolva sua angústia com seu Psicanalista. Aqui usaremos o Google!
  71. Para inteiros... Vou experimentar! Loirinha, vc. fez um golaço! É

    uma forma de obter os expoentes das representações float e double!
  72. Bem, Loirinha, vamos buscar informações sobre “floating point”. E agora

    Mestra? Em “binary representation” não havia nada!
  73. Nossa, quanta informação. Novamente, vou no 1º da lista, finfo.

    Nossa, quanta informação. Vou olhar a 1ª da lista, a finfo
  74. Surfista! Buscando por finfo no Sumário do Manuel do Numpy

    você é levado de imediato para esta página.
  75. Obrigado Manoel. Vemos que a classe finfo fornece informações sobre

    tipos float do Numpy (seus limites). Mestra não vejo como proceder para utilizar essa classe. Além disso, parece que faltam informações (Atributos = ??).
  76. Certo, meus jovens, Vamos usar o velho help(finfo) Para quem

    sabe Python, basta esta informação!
  77. Instanciando o parâmetro dtype dessa classe com objetos apropriados (tipos

    float) do NumPy, obteremos informação sobre seus limites.
  78. Half s e f 16 bits 10 bits 5 bits

    Esse é o desenho do tipo half (float16).
  79. (-1)s ∗ 2e-15 ∗ (1.f) ..... se 0 < e

    < 31 (-1)s ∗ 2e-14 ∗ (0.f) .... se e = 0 e f ≠ 0 (-1)s ∗ 0 ..................... se e = 0 e f = 0 (-1)s ∗ Inf ................. se e = 31 e f = 0 NaN .......................... se e = 31 e f ≠ 0 x = O bias é 01111 = 15 e épsolon é dado por ε = 2-10 = 1/1024 = 0.0009765625. A regra de decodificação é:
  80. Loirinha, os Mestres já falaram sobre quase tudo isso! É...

    Mas estou curiosa para ver o que mais tem no MachAr.
  81. Parece igual, Surfista: MachAr também é uma classe do Numpy,

    com vários métodos (as funções) e atributos.