2012-04-10 32 views
1

我認爲Ruby的BigDecimal類的目的是無限精確地以速度爲代價的 。錯誤: Ruby中的平方根比BigDecimal.sqrt更精確?

> BigDecimal(4).sqrt(4) 
=> #<BigDecimal:906602c,'0.1999999999 9999999998 66602351E1',36(36)> 
> BigDecimal(4).sqrt(11) 
=> #<BigDecimal:9e36850,'0.2E1',9(45)> 

首先,sqrt應該沒有參數,至少文檔。其次,如果該參數是精度,則4應該足夠進行此操作(或者至少我不應該知道11位精度是可以的)。

我想要的最後一件事是重新發明輪子,並創建一些我自己的「任意精確的平方庫」。

問題:

  • 是否有可能參數設置爲一個BigDecimal實例,以使上述情況不會發生? (意思是:它以低精度給出正確的結果)
  • 是否有關於BigDecimal對象的任何詳細信息(這些數字在值之後)?

系統:Debian的,32位,紅寶石1.9.3p125

+0

你又問了什麼問題? (我明白你基本上使用這個問題來抱怨的問題,但我不確定你在Stack Overflow中尋找什麼幫助。)Just _「BigDecimal上的文檔在哪裏(http:// ruby-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/BigDecimal.html)"_? – Phrogz 2012-04-10 20:49:12

+0

要使「無限精確」sqrt你需要無限的記憶。猜猜你沒有。那怎麼了? – 2012-04-10 20:52:23

+0

@VictorMoroz我有很多的記憶,但令我沮喪的是,我無法測試所有這些,因爲我遇到這個問題,即4的平方根不是2,在一個任意精確的庫中。 – karatedog 2012-04-11 09:43:52

回答

1

inspect大小數文檔描述了什麼輸出的裝置。

關於這似乎是一個文檔錯誤爲sqrt文件 - 見http://bugs.ruby-lang.org/issues/5267

至於你得到的輸出,我不知道 - 我在這兩種情況下獲得0.2E1。

+0

在_arbitrary precision_中,如果重複的非終止數字(如1.0/3.0),*最大精度*的含義是什麼?我認爲_precision_是由我設定的,因爲任意的精度不應該有預設的硬限值。 – karatedog 2012-04-11 10:16:51

+0

任意不等於無限。你可以要求任何精度(10位有效數字,100等),但你需要提前選擇 – 2012-04-11 11:20:14

+0

這正是我寫的:「*精度是由我設置的* *」。然而BigDecimal似乎自己挑選了一些精確值。 – karatedog 2012-04-11 11:25:42