| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:30:20
|
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.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:20:02
|
wellington.nogueira
GUJ Ranger
![[Avatar]](/images/avatar/00c1de56b1cbab48f9869c1460d70e76.png)
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/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:40:40
|
wellington.nogueira
GUJ Ranger
![[Avatar]](/images/avatar/00c1de56b1cbab48f9869c1460d70e76.png)
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/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 14:56:32
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 16:47:22
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/05/2011 08:18:30
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/05/2011 08:29:47
|
maior_abandonado
JWizard
![[Avatar]](/images/avatar/0d7c463832b871c20405a6c9296b5517.jpg)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/05/2011 10:26:41
|
wellington.nogueira
GUJ Ranger
![[Avatar]](/images/avatar/00c1de56b1cbab48f9869c1460d70e76.png)
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.
|
|
|
 |
|
|