簡體   English   中英

對double進行轉換是否始終返回相同的值?

[英]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值。

如果你垂頭喪氣一個doublefloat ,你失去的精度和數據。 float向上轉換為double是一個擴大的轉換; 如果然后往返,則不會丟失任何數據...也就是說,除非您在將其向下轉換回浮點之前對該值執行某些操作

浮點數會犧牲范圍的精度和精度。 單精度浮點數可提供32位精度; 雙精度給你64位。 但它們可以表示超出基礎精度指示范圍的值。

C# floatdouble是IEEE 754浮點值。

尾數的有效精度比其表觀大小(浮點魔法)高1位。

一些CLR浮點資源為您服務:

本文可能是關於浮點運算的危險和陷阱的規范性論文。 如果您不是ACM的成員,請單擊標題上的鏈接以查找該文章的公共下載:

  • 大衛戈德伯格。 1991. 每個計算機科學家應該了解浮點運算 ACM Comput。 監測網。 23,1(1991年3月),5-48。 DOI = 10.1145 / 103162.103163 http://doi.acm.org/10.1145/103162.103163

    抽象
    浮點算術被許多人視為深奧的主題。 這是相當令人驚訝的,因為浮點在計算機系統中無處不在:幾乎每種語言都有浮點數據類型; 從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.

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