2009-05-08 13 views
11

Ostatnio, czasami (rzadko), kiedy eksportujemy dane z naszej aplikacji, dziennik eksportu zawiera wartości zmiennoprzecinkowe, które wyglądają jak "-1. # J". Nie udało mi się go odtworzyć, więc nie wiem, jak wygląda zmiennoprzecinkowe w pliku binarnym ani jak program Visual Studio go wyświetla.Co oznacza błąd zmiennoprzecinkowy -1. # J?

Próbowałem spojrzeć na kod źródłowy dla printf, ale nie znalazłem niczego (nie jestem w 100% pewny, że spojrzałem na odpowiednią wersję ...).

Próbowałem googling, ale google wyrzuca wszelkie #, wydaje się. I nie mogę znaleźć żadnych list błędów typu "float".

+0

Zobacz także: http://stackoverflow.com/questions/5541975/what-does-1-mean/5542066#5542066 –

Odpowiedz

27

Może to być ujemna nieskończoność lub NaN (nie liczba). Ze względu na formatowanie w polu printf nie rozróżnia między nimi.

Próbowałem następujący kod w Visual Studio 2008:

double a = 0.0; 
printf("%.3g\n", 1.0/a); // +inf 
printf("%.3g\n", -1.0/a); // -inf 
printf("%.3g\n", a/a); // NaN 

co powoduje następujące dane wyjściowe:

1.#J 
-1.#J 
-1.#J 

usuwania specyfikator formatowania 0,3 daje:

1.#INF 
-1.#INF 
-1.#IND 

więc jest jasne, 0/0 daje NaN, a -1/0 daje ujemną nieskończoność (NaN, -inf i + inf są jedynymi "er" roneous "liczby zmiennoprzecinkowe, jeśli dobrze pamiętam)

+0

Interesujące ... Zastanawiam się, dlaczego to się kończy się z "J", gdy obcina się wskaźniki nieskończoności/NaN? –

+14

J jest wynikiem zaokrąglenia "cyfr" do jednego miejsca. – RBerteig

+3

Tłumaczenie NaN i INF na kod z początkową cyfrą i kropką jest poważnym błędem IMHO. Zbyt łatwo jest znaleźć pole numeryczne w pliku tekstowym, które można ponownie odczytać (z niedoskonałym, ale prawdopodobnym parserem, co prawda) jako wartość +1 lub -1, która jest niepodobna do drukowanej wartości. Byłoby znacznie lepiej napisać to jako + # INF, - # INF, i tak dalej. – RBerteig