2012-01-12 19 views
2

我正在編寫幾個函數,它們會將float/double轉換爲固定點和返回。有沒有人知道確定用於float或double的指數部分的位數的最佳方法?我希望能夠使用std :: numeric_limits,但沒有運氣。指數使用了多少位

指數部分是由C++標準定義還是編譯器/機器特定?或者它可以在運行時變化嗎?

回答

6

如果在該平臺上的float被編碼在IEC-559(又名IEEE754在美國)中,則它將總是8位。如果該平臺的double使用IEC-559編碼(或任何64位版本),則它將始終爲11.如果不是,那麼甚至不能假定它存儲指數。

而標準不指定應保存什麼格式浮點數,在C++ 11(和C++ 03?),你可以測試是否floatdouble使用numeric_limits<T>::is_iec559符合IEC-559(其中T是一個浮點型):

#include <limits> 

cout << "float is IEC-559? " << numeric_limits<float>::is_iec559 << endl 
    << "double is IEC-559? " << numeric_limits<double>::is_iec559 << endl; 
0

閱讀上IEEE-754floatdouble的指數大小應分別爲8位和11位。

1

從numeric_limits中缺少什麼<> :: {min_exponent,max_exponent}? (他們被限制爲正常數字給出答案,如果這不適合你,則與denormdigits結合)。

0

浮點數的特性取決於機器的體系結構。它在運行時不會改變。看看編譯器的頭文件< cfloat>,它應該有詳細信息。

但你也可以潛入機自己: 本書數字食譜用C由W.H. Press et al。在第20.1章(較少數值算法)中包含一個名爲machar.c的程序來檢測機器的浮點能力,而不需要假設任何標準庫標題。它也可用online