Multiplicação imprecisa no esquema mit [fechado]

5

Descobri que a multiplicação do ponto flutuante no esquema mit não é precisa, por exemplo,

1 ]=> (* 1991.0 0.1)

produzirá

;Value: 199.10000000000002

Você poderia, por favor, ajudar a explicar a aparência do estranho número “2”?

    
por TJH 14.01.2018 / 05:15

2 respostas

8

Esta citação é da memória e provavelmente não está certa, mas transmite a essência do problema: "Operar em números de ponto flutuante é como mover pilhas de areia: toda vez que você faz isso, você perde um pouco de areia e um pouco de sujeira "(de Kernighan e Plauger" Elementos de estilo de programação "IIRC). Toda linguagem de programação tem esse problema.

    
por 14.01.2018 / 05:30
11

Lembre-se de que os computadores são binários

Independentemente de quantos dígitos de base 2 você deseja usar, o valor decimal 0,1 não pode ser representado exatamente como uma fração de base 2.

Na base2 1/10 é 0,0001100110011001100110011 ... (repetindo para sempre)

Infelizmente, isso é resultado de um ponto flutuante binário, e qualquer linguagem que use o FPU terá resultados semelhantes, como o Python.

In [1]: 1991.0 * 0.1
Out[1]: 199.10000000000002

In [2]: 0.1 + 0.2
Out[6]: 0.30000000000000004

Este é um Representation error porque muitas vezes as frações decimais não podem ser representadas exatamente como frações binárias (base 2).

Perl, C, C ++, Java, Fortran, Python e esquema demonstrarão esse comportamento.

    
por 14.01.2018 / 05:32