2017-06-16 51 views
1

我有一些來自其他函數的漂浮列表。 我所知道的是,在理想世界中存在一個共同因子 ,它可以用來乘以每項來獲得整數列表。 可能會有一些小的數字噪音(〜1e-14)。找到將漂浮列表轉換爲整數列表的公共因子

因此,例如

[2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667] 

這裏每學期可以通過3乘以獲得

[7.0, 14.0, 3.0, 5.0] 

我如何才能找到這個詞?我們可以假設整數解存在。

任何有用的意見,將不勝感激

+0

還有,你試過嗎? –

+0

嘗試除以列表的最大公約數。它有時會起作用,但經常變得非常有用 – ad1v7

+0

非整數數字的gdc是多少? – JohanL

回答

1

Python的Fraction類型可以浮動點轉換爲有理數與分母百萬下,然後你可以找到的最小公分母。

>>> from fractions import Fraction 
>>> a = [2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667] 
>>> [Fraction(x).limit_denominator() for x in a] 
[Fraction(7, 3), Fraction(14, 3), Fraction(1, 1), Fraction(5, 3)] 

直截了當地找到最小公倍數使用math.gcd功能:

>>> denoms = [3,3,1,2] 
>>> functools.reduce(lambda a,b: a*b//math.gcd(a,b), denoms) 
6 
+0

你在那裏中途......這並不能保證* common *因素。 –

+0

非常漂亮的把戲!但理論上,我們應該首先猜測分母的界限(默認爲1000000)。 –

+0

工程就像一個魅力!感謝那。 – ad1v7

0

蠻力的解決方案。還是找一些更普遍的...

def find_int(arr): 
    test = False 
    epsilon = 1e-15 
    maxint = 1000 
    for i in range(2, maxint, 1): 
     for item in arr: 
      if abs(i*item-round(i*item)) < epsilon: 
       test = True 
      else: 
       test = False 
       break 
     if test: 
      print i 
      return [int(round(i*item)) for item in arr] 
    print "Could not find one" 
    return arr 
+0

請注意,'abs(x - int(x))'不是一個好的測試!想想0.999999999:它是* close * 1,但是int(0.999999999)是0 ... –

+0

感謝您的發現。將它改爲round() – ad1v7

相關問題