2012-12-17 87 views
1

我有一個項目使用泰勒系列創建一個科學計算器。此外,我正在分析一個數字到ieee 754標準浮點系統。獲取存儲的實際數量

在我的計算器中,用戶選擇是否需要單精度或雙精度:我使用float和double變量, ,然後分析ieee 754規範後面的數字。

如果用戶想要雙精度的分析是這樣的:

double analyze=3.45 
BigDecimal bd=new BigDecimal(analyze) 

這給了我

3.45000000000000017763568394002504646778106689453125 
  1. 是這個數字是存儲在二進制格式的實際數量電腦內存?

  2. 如果不是有什麼辦法,我可以有存儲號碼的真實價值?

  3. 此外,爲什麼會發生這種情況?

    double analyze=0.5
    BigDecimal db=new BigBecimal(analyze)

只會打印0.5 - 爲什麼我失去顯著數字?

誰能告訴我,爲什麼不通過運行此發生這種情況

 BigDecimal one=new BigDecimal(0.1); 
     BigDecimal five=one.multiply(new BigDecimal(5)) ; 
     System.out.println("5 times 0.1 is "+" "+ five); 

     System.out.println("But the 0.5 in BigDecimal is " + " "+ new BigDecimal(0.5)); 

你 5倍0.1是0.5000000000000000277555756156289135105907917022705078125 但是在BigDecimal的0.5是0.5

+0

不,這不是存儲的數字。存儲的數字是* binary *。你可以用'Double.doubleToRawLongBits'來訪問它。 –

+0

我還必須做一個其他問題whick讓我困惑,如果我轉換一個浮點數例如0.5到bigdecimal它給了我一個其他的結果比轉換0.1到bigdecimal並添加它5次! – user1911078

+0

這兩個值應該非常相似,但由於舍入誤差,您可能會看到一些差異是最不重要的一位或兩位數。 –

回答

3

1.I要問你是這個數字是以二進制格式存儲在PC內存中的實際數字?

是的。

2.如果是沒有任何辦法可以有存儲

井數的真正價值,它是,所以沒有問題。

  1. 它打印我的只有 - > 0.5爲什麼我失去發生了重大的數字?

你沒有; 0.5是以二進制格式存儲的確切數字。

+0

該數字的「真實」值是使用doubleToRawLongBits訪問的二進制表示。 –

+0

我不清楚這是OP想要的「真正」價值。 –

-2

一般來說,float和double將會是而不是正好表示一個十進制數(除了兩個和幾個其他的「甜點」的冪)。該號碼以二進制內部存儲。您可以通過Double.doubleToRawLongBitsFloat.floatToRawIntBits訪問內部表示。

+1

每個float和double都精確地表示一些十進制數。 –

+0

@StephenCanon - 並非每個十進制數都有浮點/雙精度表示。 (例如見上述3.45) –

+0

這就是我所說的話。 –

3
  1. 是,3.45000000000000017763568394002504646778106689453125是存儲在一個雙重當你轉換的數字「3.45」驅動到公共雙格式的實際值。

  2. 這是真正的價值。

  3. 您沒有顯示您打印0.5的方法。據我所知,Java中的一種常見顯示機制只需輸出儘可能多的數字來精確表示值,如果可能的話。它不打印尾隨零,因爲它們是多餘的。

你可能想知道「嗯,如果只是.5印,我怎麼知道電話號碼爲0.5000000000而不是0.5000000001或類似的東西?」答案是,如果號碼分別來自不同.5,會打印更多的數字,因爲顯示機制被定義爲這樣做。所以你可以依靠這個事實,即「.5」意味着.5,沒有什麼比這更重要。

如果這是一個學校項目,那麼你可能不需要擔心3.45被表示爲稍微不同的值。只需繼續並使用double中的值進行計算即可。

另外,泰勒級數對於真實計算器來說是一個糟糕的選擇,因爲它們被設計成在一個點附近是精確的,但是你會希望一個在一個區間內準確的序列。還有其他一些系列可以更好地分析錯誤,因此他們需要更少的術語才能獲得準確的結果。如果它被建議作爲學校項目的一部分,我只會使用泰勒系列。

+0

首先感謝!沒有它是一個畢業生項目!所以你的意思是,如果你鍵入0.5它將存儲0.5 excacly你確定會導致我的proffesor對我說,如果你輸入例如0.5它的商店更精確的數字! – user1911078

+0

我的意思是,它存儲的數字不僅僅是「0.5」,而是多餘的數字都是零。它存儲確切的值'0.5'。 (沒有理由打印'0.50000'或無論多少零,因爲您不能將二進制精度轉換爲十進制精度。) –

1
  1. 是的。 BigDecimal(double)構造函數「將double翻譯爲BigDecimal,它是double的二進制浮點值的精確十進制表示形式。」 BigDecimal toString方法顯示確切的值。

  2. N/A

  3. 0.5是作爲雙精確表示。 BigDecimal(0.5)結果具有未換算的值5和換算比例1.它滿足BigDecimal toString條件,無指數顯示。中位數小數點後等於規模,1

您的示例代碼:

BigDecimal one=new BigDecimal(0.1); 
    BigDecimal five=one.multiply(new BigDecimal(5)) ; 

帶出與使用BigDecimal雙重構造,除非你試探雙重代表問題。 0.1不能完全表示爲雙精度,所以你的「一」不完全是0.1,即使BigDecimal("0.1")是精確的。

更一般地,雙的精確值總是具有形式a/(2**b)其中ab是整數,並且"**"表示取冪。 (a * 5**b)/(10**b)具有相同的值,並且可以用具有比例b的BigDecimal來表示。

相關問題