![](/img/trans.png)
[英]Why does C# is keyword return true for double, but false for float even though casting to float works?
[英]Does casting double to float always return same value?
鑄造double
float
總是產生相同的結果,還是會有一些“四舍五入的差異”?
例如,是x
in
float x = (float)0.123456789d;
總是一樣的價值?
什么時候浮動加倍,然后再將其投射回浮動即。 (float)(double)someFloat
?
最感興趣的是C#中的結果,但如果您對其他語言的工作原理有所了解,請隨時分享。
除非語言偏離IEEE規范,否則結果不應取決於語言。
所有浮點數都可以精確地表示為雙精度數,因此從float到double到float的往返應該產生與您開始時相同的值。
類似地,將任何double值轉換為float應始終產生相同的結果,但是,當然,有許多不同的double值會截斷為相同的float值。
如果你垂頭喪氣一個double
的float
,你失去的精度和數據。 將float
向上轉換為double
是一個擴大的轉換; 如果然后往返,則不會丟失任何數據...也就是說,除非您在將其向下轉換回浮點之前對該值執行某些操作 。
浮點數會犧牲范圍的精度和精度。 單精度浮點數可提供32位精度; 雙精度給你64位。 但它們可以表示超出基礎精度指示范圍的值。
C# float
和double
是IEEE 754浮點值。
float
是單精度IEEE 754值 (32位),由a組成
double
是雙精度IEEE 754值 (64位)並由a組成
尾數的有效精度比其表觀大小(浮點魔法)高1位。
一些CLR浮點資源為您服務:
本文可能是關於浮點運算的危險和陷阱的規范性論文。 如果您不是ACM的成員,請單擊標題上的鏈接以查找該文章的公共下載:
抽象
浮點算術被許多人視為深奧的主題。 這是相當令人驚訝的,因為浮點在計算機系統中無處不在:幾乎每種語言都有浮點數據類型; 從PC到超級計算機的計算機都有浮點加速器; 大多數編譯器都會被要求不時編譯浮點算法; 幾乎每個操作系統都必須響應溢出等浮點異常。 本文提供了一個關於浮點方面的教程,它對計算機系統的設計者有直接影響。 它首先介紹浮點表示和舍入誤差,繼續討論IEEE浮點標准,最后舉例說明計算機系統構建器如何更好地支持浮點。
在某些情況下,與數字量最接近的float
表示可能與通過將最近的double
表示舍入到float
獲得的值不同。 兩個這樣的數量是12,344,321.4999999991和12,345,678.50000000093。 這些量的上下兩個整數可以精確地表示為float
,但是它們中最接近的double
部分的精度為0.5的小數部分。 因為將這樣的double
精度值(在2 ^ 23和2 ^ 24之間,精確到0.5的一小部分)轉換為float
將舍入到最接近的偶數整數; 在每種情況下,編譯器將最終四舍五入遠離原始數字的值。
請注意,在實踐中,編譯器似乎將數字解析為double
,然后轉換為float
,因此即使12344321.4999999991f應該舍入到12344321f,它也會舍入到12344322f。 同樣,12345678.50000000093f應該舍入到12345679f但是舍入到12345678f,所以即使在轉換為double
然后float
失去精度的情況下,通過將數字直接指定為float
也無法避免這種轉換損失。
順便提及,值12344321.4999999992f和12345678.50000000094f被正確舍入。
考慮到它們具有不同的精度,即使我從較低精度到較寬精度(我認為這實際上是您的懷疑),結果也不一定相同。
浮點運算,尤其是轉換,總是截斷/舍入和任何其他類型的近似 。
double應該能夠准確地保存float的每個可能值。 將float轉換為double不應更改該值,並且只要在此期間未對double執行任何計算,則返回到float應返回原始值。
C#中的浮點數使用IEEE 754格式(http://en.wikipedia.org/wiki/IEEE_754)存儲。 這種格式有兩部分:數字和指數。 雙打保持52位數,浮動保持23位數。 基數是2,而不是10。 因此,對於上面的示例(0.123456789),數字將是111010110111100110100010101(123456789的二進制表示)。 這是27位數,適合雙倍,但不是浮動,所以是的,在往返轉換中精度會丟失。
另一方面,如果您的數字是0.123456,則數字將是11110001001000000(17位數),它可以很好地適合浮點數或小數,因此您在往返演員表中將失去精確度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.