簡體   English   中英

是否總是可以將`int`轉換為`float`

[英]Is it always possible to convert an `int` to a `float`

是從一個轉換intfloat而不總是能夠用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。

它不應該是intINT_MAX上限范圍。 它是低端 INT_MIN ,其數量通常比INT_MAX大+1。

124位int min值可能約為-1.06e37,因此確實超過了最小float范圍。

對於常見的binary32 floatint纏繞需要超過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM