sobre_flutuantes.html 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. Veio do texto "introducao_caracteres.html" de 2017/05/01
  2. <a name="pontoflutuante"><span style="color: #0050A0">Representação em ponto flutuante</span></a>
  3. <p>
  4. A técnica de representação de números em <b>ponto flutuante</b> consiste em separar os <em>bits</em> do número
  5. em duas partes, além do sinal, a <b>mantissa</b> e o <b>expoente</b>, da seguinte forma:
  6. <center>
  7. <tt>b<sup>e</sup> x 0.d<sub>1</sub>d<sub>1</sub>...d<sub>p-1</sub></tt>, &nbsp;
  8. <tt>b</tt> é a base (binário ou decimal), o expoente <tt>e</tt> e a precisão <tt>p</tt>.
  9. </center>
  10. O número <tt>0.d<sub>1</sub>d<sub>1</sub>...d<sub>p-1</sub></tt> é a <b>mantissa</b>.
  11. </p>
  12. <p>
  13. Esta técnica de representação é a mais utilizada nos computadores, ela utilizar um <em>bit</em> para sinal,
  14. uma quantidade pequena de <em>bits</em> para o expoente e uma quantidade maior de <em>bits</em> para a parte "principal" do
  15. número. Em um dos padrões de representação (IEEE 754) o número é representado com 11 <em>bits</em> para o expoente e
  16. 52 <em>bits</em> para a mantissa.
  17. </p>
  18. <a name="exemplo"><span style="color: #0050A0">Exemplo de representação em ponto flutuante</span></a>
  19. <p>
  20. Para ilustrar o funcionamento de ponto flutuante, suponha um computador que use decimal para a mantissa e binário para expente.
  21. Se o computador tiver apenas 3 dígitos para mantissa e 2 <em>bits</em> para o expoente, assim teríamos
  22. <tt>p=3</tt> e <tt>-3<=e<=1</tt>.
  23. A lógica utilizada para separar os 4 possíveis binários (<tt>00</tt>, <tt>01</tt>, <tt>10</tt> e <tt>11</tt>)
  24. foi: o primeiro <em>bit</em> ligado implica valor negativo, mas o binário <tt>10</tt> é ignorado (por corresponder ao
  25. decimal <tt>-0</tt>, assim <tt>-1<u><</u>e<u><</u>1</tt>.
  26. </p>
  27. <p>
  28. Deste modo, o maior valor real que pode ser representado seria o <tt>9.99</tt>, pois tomando a maior mantissa e maior
  29. expoente, teríamos <tt>10<sup>1</sup> x 0.999 = 9.99</tt>,
  30. </p>
  31. <p>
  32. Já o menor positivo seria o <tt>0.0001</tt>, pois tomando a menor mantissa positiva e menor expoente possível (-1),
  33. teríamos <tt>10<sup>-1</sup> x 0.001 = 0.0001</tt>,
  34. </p>
  35. <a name="io"><span style="color: #0050A0">Entrada e saída de flutuantes em <i>C</i> e em <i>Python</i></span></a>
  36. <p>
  37. Em <i>C</i> deve-se utilizar o formatador <tt>%f</tt> para indicar que os <em>bits</em> devem ser tratados como número
  38. em ponto flutuante, enquanto em <i>Python</i> deve-se utilizar a função <tt>float(...)</tt>, como indicado no exemplo
  39. abaixo.
  40. <center>
  41. <a name="tab2">
  42. Tab. 4. Sobre a leitura de caracteres em <i>C</i> e em <i>Python</i></a>
  43. <br/>
  44. <table class="tbCodeLinCol">
  45. <tr><th>C </th> <th>Python 2</th> <th>Python 3</th></tr>
  46. <tr valign="top"><td><table class="tbCode">
  47. <tr><td><pre>// Vale notar: se usuario digitar uma "string", como
  48. // "nome", apenas o caractere 'n' vai para x
  49. float x; // declaracao de variavel em "ponto flutuante"
  50. scanf("%f", &x); // leia como "ponto flutuante"
  51. printf("%f", x); // imprima como "ponto flutuante"
  52. </pre></td></tr>
  53. </table></td>
  54. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  55. # "nome", a variavel x recebera' a "string" toda
  56. x = raw_intput() # leia como "ponto flutuante"
  57. print(x)
  58. </pre></td></tr>
  59. </table></td>
  60. <td><table class="tbCode"><pre># Vale notar: se o usuario digitar uma "string", como
  61. # "nome", a variavel x recebera' a "string" toda
  62. x = intput() # leia como "ponto flutuante"
  63. print(x)
  64. </pre></td></tr>
  65. </table></td>
  66. </tr>
  67. </table></center>
  68. </p>
  69. <p>
  70. Aos alunos estudando com a linguagem <i>C</i>, tomem um <b>cuidado adicional</b>: o compilador <i>C</i> aceita utilizar o formatador
  71. de inteiro na leitura e na impressão de uma variável em flutuante. Ele trunca o valor, assim se tiver <tt>float x=1.5;</tt>
  72. e fizer <tt>printf("x=%d\n", x);</tt>, não haverá erro de compilação e será impresso <tt>x=1</tt>.
  73. </p>