2017-11-03 10 views
0

numpyを使用して階乗関数を作成しました。コードは次のとおりです。Pythonでの階乗関数の問題(コードを参照)

import numpy as np 

def factorial(x): 
    n=[] 
    if x==1: 
     return 1 
    if x>1: 
     while x>1: 
      x-=1 
      n.append(x+1) 
    return np.prod(np.array(n)) 

この関数は階乗(12)までうまくいきます。

一方、この1つは、任意の数で動作します:

def fact(n): 
    num = 1 
    while n > 1: 
     num *= n 
     n -= 1 
    return num 

例えば私は20!:

factorial(20) 
Out[65]: -2102132736   #Wrong 

fact(20) 
Out[66]: 2432902008176640000 #Correct 

は誰もが私を理解するのに役立つ可能性がありい計算しようとすると、これが悪化私の機能に何が問題なの? ありがとうございます

+0

戻り値np.prod(np.array(n、dtype = "float32"))または大きい範囲のある型 – Gor

答えて

2

Cスタイル固定精度整数を使用するnumpyライブラリを使用しているため、オーバーフローする可能性があります。これはあなたの階乗関数で起こっていることです。これを修正するには、より大きい階乗のためにdtype 'int64'の配列を構築する必要があります。

通常のPython整数では発生しませんが、言語がオーバーフローする前に長整数に自動的に変換されるため、追加したいと思います。

+0

なぜこれが下降したかを知りたいのですが。私が間違っているなら、どうしても、私を修正してください。 – Dumbassahedratron