Como o computador faz conta?

boa tarde, nobres foristas.

venho por meio desse veículo digital atemporal e não-espacial a fim de manifestar minha curiosidade acerca de um fenômeno computacional não compreendido pelo meu espírito, mas que algum eminente forista possa elucidar sobre o mesmo:

qual o resultado da conta:

3*(3.6-4)+2*(3.6-3)

???

pelas barbas do profeta, ninguém aqui sabe fazer conta?

3 * (3.6-4) + 2 * (3.6-3) = 0

porém no java e outras linguagens resulta no horrendo resultado

4.4408920985006E-16 !

Será que ninguém aqui sabe fazer conta ou a maioria sabe que operações com números em ponto flutuante podem gerar “erros”?



http://support.microsoft.com/kb/125056
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
http://steve.hollasch.net/cgindex/coding/ieeefloat.html
http://support.microsoft.com/kb/78113/pt-br

Existe uma forma matematicamente adequada de resolver este tipo de equação.
Os parênteses ficam ali com o intuito de discriminar a forma de cálculo, porém, não têm a função de priorizar as duas subtrações, mas, indicar que é preciso calcular a multiplicação entre o elemento imediatamente à esquerda de cada um dos abre parênteses.
A saber:

Se realizassemos primeiro as partes internas aos parênteses, teríamos um resultado

Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s

Só uma correção caro drsmachado

3,6 - 4 = -0,4. Isso mudaria o resultado que você encontrou. Veja:

//aqui você calculou 3.6-4 = -0,6
3 * (3.6-4) + 2 * (3.6-3)
3 * (-0.6) + 2 * (0.6);
1.8 + 1.2

            3 

//na verdade, creio que seria
3 * (3.6-4) + 2 * (3.6-3)
3 * (-0.4) + 2 * (0.6);
-1.2 + 1.2

            0 

Não é isso? Ou fiz alguma tolice?

[quote=davidbuzatto]Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s[/quote]

:lol:

Like a dog with a cape.

Tchauzin!

[quote=drsmachado]Existe uma forma matematicamente adequada de resolver este tipo de equação.
Os parênteses ficam ali com o intuito de discriminar a forma de cálculo, porém, não têm a função de priorizar as duas subtrações, mas, indicar que é preciso calcular a multiplicação entre o elemento imediatamente à esquerda de cada um dos abre parênteses.
A saber:

Se realizassemos primeiro as partes internas aos parênteses, teríamos um resultado

[quote]
3*(3.6-4)+2*(3.6-3)
3* (-0.6) + 2 * (0.6);
1.8 + 1.2
3
[/quote][/quote]

creio que o nobre forista não calculou com exatidão a primeira subtração entre parênteses:

(3.6-4) = 0.4

3 * 0.4 = 1.2

[quote]Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s[/quote]

0.00000000000000044408920985006 > 0
0.00000000000000044408920985006 != 0

logo, resultado incorreto!

muito intrigante isso, talvez não seja confiável esses cálculos feitos pelo computador.

[quote=apolonioDeTiana]pelas barbas do profeta, ninguém aqui sabe fazer conta?
[/quote]

[quote]Só uma correção caro drsmachado

3,6 - 4 = -0,4. Isso mudaria o resultado que você encontrou. Veja:

//aqui você calculou 3.6-4 = -0,6
3 * (3.6-4) + 2 * (3.6-3)
3 * (-0.6) + 2 * (0.6);
1.8 + 1.2

3

//na verdade, creio que seria
3 * (3.6-4) + 2 * (3.6-3)
3 * (-0.4) + 2 * (0.6);
-1.2 + 1.2

0

Não é isso? Ou fiz alguma tolice?[/quote]

Já está respondida minha pergunta.

[quote=apolonioDeTiana]

[quote]Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s[/quote]

0.00000000000000044408920985006 > 0
0.00000000000000044408920985006 != 0

logo, resultado incorreto!

muito intrigante isso, talvez não seja confiável esses cálculos feitos pelo computador.[/quote]

A é? Depende.
E 1,999999999999999999999999999999999999999999999999999999999999999999999999999999999999 (dízima periódica)?
Você diria que 1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999 é menor ou igual a 2?
Se você calcular a fração geratriz desse número, você vai chegar no resultado 2! E isso não é um sofisma (sabe o que é sofisma?).

Acho que você não leu nada que eu passei.
Uma coisa são os números que nós operamos. Outra são os números que o computador opera. Não sei se você sabe, mas a memória e o poder de representatividade dos computadores são FINITOS.

[]'s

[quote=lina][quote=davidbuzatto]Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s[/quote]

:lol:

Like a dog with a cape.

Tchauzin![/quote]

:smiley:

[quote=apolonioDeTiana]pelas barbas do profeta, ninguém aqui sabe fazer conta?

3 * (3.6-4) + 2 * (3.6-3) = 0

porém no java e outras linguagens resulta no horrendo resultado

4.4408920985006E-16 ! [/quote]

espertão mesmo esse cara…

chama o profeta mesmo…

[quote=apolonioDeTiana][quote=drsmachado]Existe uma forma matematicamente adequada de resolver este tipo de equação.
Os parênteses ficam ali com o intuito de discriminar a forma de cálculo, porém, não têm a função de priorizar as duas subtrações, mas, indicar que é preciso calcular a multiplicação entre o elemento imediatamente à esquerda de cada um dos abre parênteses.
A saber:

Se realizassemos primeiro as partes internas aos parênteses, teríamos um resultado

[quote]
3*(3.6-4)+2*(3.6-3)
3* (-0.6) + 2 * (0.6);
1.8 + 1.2
3
[/quote][/quote]

creio que o nobre forista não calculou com exatidão a primeira subtração entre parênteses:

(3.6-4) = 0.4

3 * 0.4 = 1.2

[quote]Ah, outra coisa nobre forista, você viu que o número que você forneceu está em notação científica?

4.4408920985006E-16 = 0.00000000000000044408920985006

[]'s[/quote]

0.00000000000000044408920985006 > 0
0.00000000000000044408920985006 != 0

logo, resultado incorreto!

muito intrigante isso, talvez não seja confiável esses cálculos feitos pelo computador.[/quote]

A questão é que a maioria dos runtimes utiliza um método não-exato/aproximado para fazer cálculo de números reais (pontos flutuantes) utilizando matemática binária, o padrão IEEE 754. Este padrão garante velocidade para cálculos usando pontos flutuantes e alguma imprecisão. (ver http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#9208)

Se você quiser/precisar fazer cálculos cujos resultados sejam matematicamente corretos, melhor usar alguma outra coisa como, no caso de Java, java.math.BigDecimal ou as classes da biblioteca JScience.

É verdade, computador calcula tudo errado e me faz ver que ele não serve para porcaria nenhuma. E aí, galera, vamos organizar uma fogueira em massa para jogarmos essas criaturas, que nos enganaram durante anos?

e eu que ja achava que o povo viaja na maionese quando começa os posts com “Prezados…” aqui no forum…

e eu que ja achava que o povo viaja na maionese quando começa os posts com “Prezados…” aqui no forum… [/quote]

ai apolonio, não venha com “nobre”, tão pouco “prezado” por aqui… Aqui só tem programadores. Vc tá falando com programadores, logo, pode usar termos mais apropriados (manu, véio, lixo, etc).

Se você deixa os outros lhe chamarem de lixo, não é porque você é programador que você é lixo, e sim porque você é um lixo de pessoa, e será um lixo em qualquer profissão.

Desculpe se te ofendi, mas é porque você só se faz de coitadinho aqui no fórum, e não mexe a bunda pra se tornar algo melhor.