我正在尝试对一个大数 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
如果无法得到一个接近的近似值,有没有办法得到一个更准确的近似值,其中更多的最高有效位是相同的?
改变这一行
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
是一个非常不准确的东西。
我是一名优秀的程序员,十分优秀!