2016-04-02 19 views
3

Wir haben spezielle Funktionen wie std::nanl, um ein NaN mit einer Nutzlast zu machen. Zur Zeit ist hier, was muß ich es drucken tun zurück:Wie kann Nutzlast eines NaN gedruckt werden?

#include <iostream> 
#include <cmath> 
#include <cstring> 
#include <cstdint> 

int main() 
{ 
    const auto x=std::nanl("1311768467463790325"); 
    std::uint64_t y; 
    std::memcpy(&y,&x,sizeof y); 
    std::cout << (y&~(3ull<<62)) << "\n"; 
} 

Dies beruht auf der besonderen Darstellung long double, nämlich auf der 80-Bit-Art von x87 FPU zu sein. Gibt es einen Standardweg, um dies zu erreichen, ohne auf solche Einzelheiten der Implementierung angewiesen zu sein?

+0

Nein. Die Darstellung von Gleitkommatypen - einschließlich der Unterstützung von NaNs - ist implementierungsdefiniert. Nicht alle Fließkommadarstellungen können NaNs unterstützen. Aus Sicht der C++ - Implementierung gibt es daher keine Garantie, dass ein NaN überhaupt dargestellt werden kann und - wenn es sein kann - wie es dargestellt wird. – Peter

Antwort

1

C++ Importe nan* Funktionen von ISO C ISO C-Zustände in 7.22.1.3:

die Bedeutung der n-char-Sequenz ist die Implementierung definiert

mit einem Kommentar

Eine Implementierung kann die n-char-Sequenz verwenden, um zusätzliche Informationen zu bestimmen, die im Signifikanten des NaN dargestellt werden sollen.

Es gibt keine Methode, um die gespeicherten Informationen zu erhalten.

+2

Wie würdest du frexp benutzen? Glibc zum Beispiel dokumentiert, dass für einen NaN, es eine NaN zurückgibt ... –

+0

@MarcGlisse Entschuldigung, ich überprüfte ISO C++ - Dokumentation und es gab keine Beschreibung, dass es nicht signifikant für NaN zurückkehrt. In ISO C gibt es auch NaN für NaN zurück. Es gibt keinen Weg, wie man es dann bekommt. – StenSoft

Verwandte Themen