[英]Is it always possible to convert an `int` to a `float`
是從一個轉換int
到float
而不總是能夠用C float
變得像+ Inf文件或-Inf的特殊值?
AFAIK對int
的范圍沒有上限。
我認為一個128位的int
會導致一個帶有IEEE754 float
的平台的問題,因為它的上限值大約是第二個的第127個冪。
簡短回答你的問題:不,並非總是可行。
但值得進一步了解細節。 以下段落顯示了標准關於整數到浮點轉換的內容( 在線C11標准草案 ):
6.3.1.4實數浮點數和整數
2)當整數類型的值轉換為實際浮動類型時,如果轉換的值可以在新類型中准確表示,則它將保持不變。 如果轉換的值在可以表示但不能精確表示的值的范圍內,則結果是以實現定義的方式選擇的最接近的較高或最接近的較低可表示值。 如果要轉換的值超出可以表示的值范圍,則行為未定義。 ...
可以精確地轉換這么多整數值。 某些整數值可能會失去精度,但轉換至少是可能的。 但是,對於某些值,行為可能未定義(例如,如果整數值無法用浮點值的最大指數表示)。 但實際上我不能假設這種情況會發生。
該標准僅要求浮點表示包括大到10 37 ( §5.2.4.2.2/ 12 )的有限數,並且不對整數的最大大小施加任何限制。 因此,如果您的實現具有128位整數(甚至是124位整數),則整數到浮點轉換可能會超出有限可表示浮點數的范圍。
是否總能將
int
轉換為float
?
合理 - 是的。 int
將始終轉換為有限float
。 對於很好的int
值,轉換可能會失去一些精度。
然而對於迂腐的人來說,一個奇怪的編譯器可能會遇到麻煩。
C允許過寬的int
,而不僅僅是16,32或64位,而float
可以有一個極限范圍,小到1e37。
它不應該是int
或INT_MAX
的上限范圍。 它是低端 。 INT_MIN
,其數量通常比INT_MAX
大+1。
124位int
min值可能約為-1.06e37,因此確實超過了最小float
范圍。
對於常見的binary32 float
, int
纏繞需要超過128位才能導致float
無窮大。
那么需要進行什么測試才能發現這種罕見情況呢?
形成精確的2次冪限制並進行仔細的數學運算以避免溢出或不精確。
#if -INT_MAX == INT_MIN
// rare non 2's complement machine
#define INT_MAX_P1_HALF (INT_MAX/2 + 1)
_Static_assert(FLT_MAX/2 >= INT_MAX_P1_HALF, "non-2's comp.`int` range exceeds `float`");
#else
_Static_assert(-FLT_MAX <= INT_MIN, "2's complement `int` range exceeds `float`");
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.