- (a - b) é a mesma coisa que (b - a) ?  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Segundo o que você aprendeu em matemática, é claro que - (a - b) é a mesma coisa que (b - a). Será?

Assim pensava o cara que fez uma otimização no JDK para economizar uma operação aritmética - sabe como é que é, cada bytecode e cada instrução conta, quando se trata de deixar seu programa mais rápido.

Só que há uma sutileza que impede usar essa identidade matemática

- (a - b) == (b - a).

Essa sutileza aparece quando a e b são exatamente iguais.

Então, em Java, o primeiro lado dá o resultado -0.0, e o segundo lado dá o resultado +0.0. Nesse caso, como você deve saber, esses números são iguais quanto a usar "==", mas não são a mesma coisa quanto eles são usados em algumas operações importantes.

Para perceber isso, note que em Java 1 / +0.0 é igual a +Infinity, e 1 / -0.0 é igual a -Infinity. O primeiro número (+Infinity) é obviamente muito diferente de -Infinity.

Mais detalhes em: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6796786

Note que muitos compiladores C e C++ também não fazem essa otimização "óbvia" - (a - b) == (b - a), justamente porque já encontraram essa sutileza antes.
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

Essa identidade está considerando, pelo que entendi, que tanto a quanto b são do tipo double, certo? Se for isso mesmo, julgo que esse problema é velho conhecido.
É um bug "besta" mas muitas vezes atrapalha...

[EDIT]
Fiz o teste da igualdade e funcionou...
[/EDIT]

[EDIT 2]
Olhando melhor o bug entendi o problema.
[/EDIT 2]

This message was edited 3 times. Last update was at 18/05/2011 13:42:50


57 45 4C 4C 49 4E 47 54 4F 4E
Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
"Se você acha que programar em Java com Swing é simples? Acredite em mim, não é!"
http://developmentforever.wordpress.com/
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

Hmm... há uma peculiaridade aqui. Olhando o bug (que está lá desde 2009), é quando a VM é chamada como -server que o mesmo ocorre. No modo client está tudo aparentemente certo. O código postado no bug realmente falha na condição específica.

Porém, um código mais simples não falha

57 45 4C 4C 49 4E 47 54 4F 4E
Você é novo no GUJ? Vai criar um tópico e colar seu código-fonte? Leia aqui antes, por favor!
"Se você acha que programar em Java com Swing é simples? Acredite em mim, não é!"
http://developmentforever.wordpress.com/
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Lembra, de alguma forma, o bug da busca binaria que o Joshua Bloch reportou, quando dava overflow:
http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Alias, trocando -(a-b) por (b-a) troca as situacoes que o overflow pode ocorrer. Também é algo a se pensar.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

pensando melhor, nesse caso o overflow ocorre na mesma situacao, quando a é um positivo grande e b um negativo grande, e a subtracao de um e de outro estoura os 2bi no caso de int.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Schuenemann
GUJ Ranger

Membro desde: 13/01/2005 12:31:27
Mensagens: 854
Offline

entanglement wrote:Para perceber isso, note que em Java 1 / +0.0 é igual a +Infinity, e 1 / -0.0 é igual a -Infinity. O primeiro número (+Infinity) é obviamente muito diferente de -Infinity.

Não dá exceção?
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

eu pensei a mesma coisa quando eu li...

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
wellington.nogueira
GUJ Ranger
[Avatar]

Membro desde: 11/08/2006 11:29:56
Mensagens: 914
Localização: Osasco-SP
Offline

Schuenemann wrote:
entanglement wrote:Para perceber isso, note que em Java 1 / +0.0 é igual a +Infinity, e 1 / -0.0 é igual a -Infinity. O primeiro número (+Infinity) é obviamente muito diferente de -Infinity.

Não dá exceção?

Está trabalhando com ponto flutuante. Exceção ocorre apenas com inteiros.

 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team