Czy 0==-0?

1

Czasami tak, a czasami nie.

System.out.println(0.0==-0.0); //true
System.out.println(1.0/0.0); //Infinity
System.out.println(1.0/(-0.0)); //-Infinity
2

1.0/(-0.0) trzeba traktować jako granicę lewostronną niż jako wynik działania to wtedy ma to sens.

0

Dlatego że w standardzie IEEE zero jest reprezentowane przez wykładnik == emin - 1 i significand == 0.
Ale w liczbach zmiennoprzecinkowych zostaje jeszcze bit znaku który może wynosić 0 albo 1. Żeby nie psuć wszystkiego (prosty test w rodzaju if(a == 0) padałby w połowie przypadków...) dodano specjalny wyjątek w porównywaniu liczb: -0 == 0.
Nie zdecydowano się jednak na to żeby zawsze ignorować (albo czyścić) bit znaku jeśli w działaniu bierze udział zero - na przykład dlatego że 1/(1/x) == x nie byłoby prawdą dla x == +Inf/-Inf. Dlatego 5*(+0)==+0 a 5*(-0)==-0

Cytując:

For example, signed zero destroys the relation x = y <==> 1/x = 1/y, which is false when x = +0 and y = -0. However, the IEEE committee decided that the advantages of utilizing the sign of zero outweighed the disadvantages.

0

@0x200x20, argument o granicy brzmi nieźle.

{
      double x=1.0;
      while(x!=0.0)
      {
          x/=-2.0; 
      }
      System.out.println(1.0/x);          
}
{
      double x=-1.0;
      while(x!=0.0)
      {
          x/=-2.0; 
      }
      System.out.println(1.0/x);          
} 
{
      float x=1.0f;
      while(x!=0.0)
      {
          x/=-2.0; 
      }
      System.out.println(1.0/x);          
}
{
      float x=-1.0f;
      while(x!=0.0)
      {
          x/=-2.0; 
      }
      System.out.println(1.0/x);          
}  

Jakich wyników byś oczekiwał?

1

Ja bym żadnych nie oczekiwał, bo to jest pseudomatematyka, którą wymyślono w standardzie IEEE. Jeżeli zachowuje się poprawnie zgodnie z tym, co napisali to okej, ale po co to przenosić do rzeczywistości?

1

Pytanie brzmi czy -0.0 == 0.0, a nie czy jakieś warunki z dzieleniem i odwrotnościami są spełnione.

Odpowiedź na zadane pytanie brzmi tak, -0.0 jest równe 0.0 we wszystkich sensownych językach programowania.

I zdecydowanie jest równe w matematyce.

Za to niektóre matematyczne twierdzenia dotyczące liczb rzeczywistych nie są spełnione dla liczb zmiennoprzecinkowych.
Nauczyliśmy się z tym żyć, a ścisłemu matematykowi musi wystarczyć tłumaczenie, że działania na komputerowych liczbach zmiennoprzecinkowych nie zawsze działają tak jak na matematycznych liczbach rzeczywistych (stanowią odrębne ciała).

0

Wystarczy poczytać, jak w standardzie IEEE 754 reprezentowane są liczby zmiennoprzecinkowe. Chodzi o to, że wiodąca jedynka mantysy nie jest zapamiętywana, więc nie ma sposobu zapisać zero dokładnie, więc przyjęto że zerem jest najmniejsza liczba jaką można zapisać, do tego dochodzi bit znaku.
Skutki tego opisują poprzednicy

1

Marek:
A o denormals zapomniałeś? One nie mają implicite wiodącej jedynki.

liczby małe – ang: denormalized numbers, wykładnik równy zero, mantysa różna od 0, nie zakłada się wiodącego niezerowego bitu; są to liczby zbyt małe aby mogły być reprezentowane z taką samą precyzją jak "zwykłe" liczby

1 użytkowników online, w tym zalogowanych: 0, gości: 1