2015-05-06 16 views
6

Oprócz makra NAN, C99 ma dwa sposoby generowania wartości NaN dla liczby zmiennoprzecinkowej, funkcji nanf(const char *tagp) i strtof("NAN(char-sequence)").Co to jest argument "sekwencji znaków" dla funkcji generujących NaN?

Obie metody generowania NaN przyjmują opcjonalny argument łańcuchowy (* tagp w nanf() i sekwencja znaków w metodzie strtof). Co dokładnie robi ten argument łańcuchowy? Nie byłem w stanie znaleźć konkretnych przykładów tego, jak z niego skorzystasz. Od cppreference.com mamy:

Nan wywołania ("ciąg") jest równoważny wywołaniu strtod ("NAN (ciąg)", (char **) NULL);

Wywołanie nan ("") jest równoważne wywołaniu strtod ("NAN()", (char **) NULL);

Wywołanie nan (NULL) jest równoważne wywołaniu strtod ("NAN", (char **) NULL);

I nan(3) mówi:

Funkcje te zwracają reprezentację (określany przez tagp) o spokojnej NaN. [snip] Tagp tagu jest używany w nieokreślony sposób. W systemach IEEE 754 istnieje wiele reprezentacji NaN, a tag-tag wybiera jeden.

To tak naprawdę nie powie mi, co mogę użyć dla ciągu tagów lub dlaczego kiedykolwiek chciałbym go użyć. Czy istnieje lista prawidłowych opcji dla tego łańcucha znaczników, a jaka byłaby przyczyna użycia jednego z domyślnych nanf(NULL)?

+0

strona cppreference jesteś związany jest konkretny przykład – Cubbi

+0

Wow. Jak to przegapiłem. Chociaż nadal nie jestem pewien, jaka jest różnica między tymi dwoma reprezentacjami w przykładzie. – mshildt

Odpowiedz

7

Tl daje możliwość posiadania różnych wartości NAN.

Jest to strona man dla nan (3), która daje trochę więcej informacji na temat tagp.

głównie:

Funkcje nan() zwracają ciche NaN, którego końcowe pole frakcji zawiera wynik konwersji tagp do liczby całkowitej bez znaku.

Daje to możliwość różnych wartości NAN różnych.

Konkretnie od C99 Uzasadnienie doc:

Inne zastosowania Nans mogą okazać się przydatne.Dostępne części NaN zostały użyte do zakodowania informacji pomocniczych, na przykład o pochodzeniu NaN z . Sygnalizujące NaN mogą być kandydatami do wypełnienia niezainicjowanego magazynu; i ich dostępne części mogłyby odróżnić niezainicjalizowane obiekty pływające. Urządzenia sygnalizacyjne IEC 60559 NaN i pułapki potencjalnie zapewniają haczyki do utrzymywania informacji diagnostycznych lub do realizacji specjalnych arytmetyki.

Istnieje jego realizacja here. Pamiętaj, może to być standardowe, ale nie musi, zgodnie z uwagami. Powinien jednak dać ci pojęcie o tym, do czego jest używany tagp.

jak w manualu, widać wymiana wspomniano powyżej:

nan("1") = nan (7ff8000000000001) 
nan("2") = nan (7ff8000000000002) 

Pełna strona człowiek tutaj:

NAN (3) Funkcje BSD Biblioteka Instrukcja
NAN (3)

NAZWA nan - generowanie cichego NaN

STRESZCZENIE include

double 
nan(const char *tagp); 

long double 
nanl(const char *tagp); 

float 
nanf(const char *tagp); 

OPIS Funkcje nan() zwracają ciche NaN, którego końcowe pole frakcja zawiera wynik konwersji tagp do liczby całkowitej bez znaku. Jeśli znacznik jest zbyt duży, aby mógł być zawarty w polu końcowej części NaN, wówczas używane są najmniej znaczące bity liczby całkowitej reprezentowanej przez znacznik.

WARTOŚCI SZCZEGÓLNE Jeśli tagp zawiera dowolne nieliczbowe znaki, funkcja zwraca pole NaN, którego końcowe ułamki to zero.

Jeśli tagp jest pusty, funkcja zwraca wartość NaN, której końcowe pole wynosi zero.

STANDARDY Funkcje nan() są zgodne z normą ISO/IEC 9899: 2011.

BSD 01 lipca 2008

+3

Należy zauważyć, że żaden standard nie określa, w jaki sposób 'tagp' ma zostać przekonwertowany na ładunek NaN. Standardy są celowo niejasne w tej kwestii, aby umożliwić implementacjom swobodę robienia rzeczy takich jak przechowywanie haszu w naturalnym języku wyjaśniającym, co spowodowało NaN w ładowności. Ogromna większość implementacji po prostu ignoruje argument "tagp" lub interpretuje go jako liczbę całkowitą, ale nie należy zakładać, że tak jest. –

+0

Dobry punkt @StephenCanon, dzięki! – bentank

3

To tak naprawdę nie powie mi, co mogę użyć dla łańcucha znaczników lub dlaczego kiedykolwiek chciałbym go użyć.

Niektóre standardy zmiennoprzecinkowe, np. IEEE-754, mają wiele różnych wartości NaN. Ta specyfikacja funkcji nan pozwala implementacji wybrać określoną reprezentację NaN w zależności od ciągu w sposób, który może być określony przez implementację. Argument

Powiązane problemy