2016-04-02 84 views
3

我們有特殊的功能,如std::nanl來製作帶有有效載荷的NaN。目前,這是我必須做的打印回:如何打印NaN的有效載荷?

#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"; 
} 

這依賴於long double具體表現,即它是80位類型的x87 FPU的。有沒有任何標準的方法來實現這一點,而不依賴於這種實施細節?

+0

不可以。浮點類型的表示 - 包括NaN的任何支持 - 都是實現定義的。並非所有浮點表示都可以支持NaN。從C++實現的角度來看,因此不能保證NaN可以被表示爲AT ALL,並且 - 如果可以的話 - - 它將如何表示。 – Peter

回答

1

C++在7.22.1.3從ISO C. ISO C狀態進口nan*功能:

該n字符序列的含義是實現定義

帶有註釋

實現可以使用n-char序列來確定要在NaN的有效數中表示的額外信息。

沒有辦法獲得存儲的信息。

+2

你會如何使用frexp? Glibc例如文件,爲NaN,它返回一個NaN ... –

+0

@MarcGlisse對不起,我檢查了ISO C++文檔,沒有描述它不返回有效數字爲NaN。在ISO C中,它也爲NaN返回NaN。沒有辦法如何得到它。 – StenSoft