1

我正在尝试用大量数字进行计算x,我取它的立方根(j = x**(1/3.0))然后重新立方它(z = j**3)。x应该等于j,并且是在使用像 26 这样的小数字然后四舍五入时,但是对于非常大的数字,我在保持准确性方面遇到了问题:

1.9.3-p385 :119 > x = 34567898765434567898765677654125 ** 3
1.9.3-p385 :120 > x = BigDecimal.new(x)
1.9.3-p385 :121 > cube_root = x**(1/3.0) 
1.9.3-p385 :122 > recubed = cube_root**3
1.9.3-p385 :123 > recubed == x
 => false 
1.9.3-p385 :124 > recubed.to_i
=> 41306551989787317397975170279355443182356154696413548486992943670408047235040641261388609159478 
1.9.3-p385 :125 > x.to_i
=> 41306551989788217308443399821163722262582437385123598833127062833015560078766131667297533203125 

如果不可能得到一个接近的近似值,有没有办法得到一个更准确的结果,其中更多的最高有效位是相同的?

4

1 回答 1

3

更改此行

cube_root = x ** (1 / 3.0)

对于这样的事情

cube_root = x ** BigDecimal('0.' + '3' * 100)

或者

cube_root = x ** BigDecimal('1/3'.to_r, 100)

你会看到不同之处。

1.9.3p194 :203 > recubed.to_i
 => 41306551989788217308443399821163722262582437385123598833127062833015560078766131667297533203124 
1.9.3p194 :204 > x.to_i
 => 41306551989788217308443399821163722262582437385123598833127062833015560078766131667297533203125

那是因为这1 / 3.0是一件非常不准确的事情。

于 2013-08-21T16:05:09.523 回答