2015-06-17 85 views
0

巨大的Float數字不會自動轉換爲BigDecimal,與從FixnumBignum的轉換一樣。例如,2.5**1000生成Infinity。我可以手動定義BigDecimalBigDecimal('2.5')**1000,但這會在數字不是很大時減慢計算速度,並且不需要BigDecimal當浮動超出範圍時自動移動到BigDecimal

有什麼辦法可以讓Float自動轉換爲BigDecimal自動(類似於從Fixnum轉換爲Bignum)?或者有沒有其他的Ruby類來做到這一點?我不關心浮點數的精度。

回答

2

作爲一種可能性,我認爲要修改Float類。由於溢可能出現在算術運算只,你可能需要覆蓋五個方法:+:-:/:*:**這樣的:

require 'bigdecimal' 
class Float 
    alias_method :__power, :** 
    def ** other 
    result = self.__power other 
    result.abs == Float::INFINITY ? BigDecimal(self, 0) ** other : result 
    end 
end 
puts 2.5 ** 1000 
#⇒ 0.87.....E398 

不是很優雅,但它一招。

+0

也許你可以使用'prepend'模塊使它更優雅。 – sawa

+0

@sawa我想到了這一點,但我終於決定沒有理由將功能封裝到模塊中,因爲它不是一個「混入」,它只是一個「Float」類補丁。 – mudasobwa

+0

謝謝Mudasobwa!它的工作,但現在的計算時間比我從一開始就定義BigDecimal中的所有變量時要高得多。我想這是因爲浮點運算中額外的if-then-else(?:)。 – Mehran