2017-03-31 2 views
4

Ich bekomme einen Fehler, wenn ich versuche, eine sehr große Zahl in Python zu berechnen. Hier ist mein Code:Python-Mathe-Bereichsfehler

# Where fourthNumber = 2790 
# and dee = 413 
emm = math.pow(fourthNumber, dee) 

Ein mein Fehler ist:

line 44, in <module> 
    emm = math.pow(fourthNumber, dee) 
OverflowError: math range error 

Gibt es eine Möglichkeit, um diesen Fehler? Ich dachte, Python könnte mit beliebig großen Zahlen umgehen? Oder liege ich falsch? Jede Hilfe wird geschätzt. Vielen Dank!

+4

'2790 ** 413' funktioniert ...' math.pow (..) 'ist mehr für Fließkommazahlen. –

Antwort

4

Sie können beliebig große ganze Zahlen Zahlen behandeln; math.pow arbeitet mit Gleitkommazahlen.

2790 ** 413> 1000 ** 413 = 1e + 1239, weit über dem Gleitkommabereich von etwa 1e + 308.

Verwenden Sie **, um innerhalb der Integers-Domäne zu bleiben und Ihre riesige ganze Zahl zu erhalten.

3

die eingebauten pow Arbeiten mit ganzzahliger Arithmetik:

>>> pow.__module__ 
'__builtin__' 
>>> pow is math.pow 
False 
>>> pow(2790, 413) 
108276934... 
4

Das Problem ist, dass math.pow(..) Arbeiten auf Gleitkommazahlen. In Python Gleitkommazahlen sind nicht beliebig groß. Nur int s sind (in und long s in ).

Sie können jedoch verwenden, um den ** Operator, der tut ganzzahlige Potenz (vorausgesetzt natürlich, die Argumente sind ganze Zahlen), wenn die beiden Zahlen ganze Zahlen sind:

>>> 2790**413 
10827693458027068918752254513689369927451498632867702850871449492721716762882046359646654407147290095143376244612860740505063304616869045757879636651922242895944635094287526023557872050108996014618928707382416906723717536207944990935946477343103732942220495426003253324856391048675505527041527544249845903325107575822015010197006079682477544271998209608154757421132764034059289159228295810448568286783859864141487725512980856505994152145510660350938086763233208252511256291934375881870590480237727775536326670654123168787472077359939510018827829233028430183558108518520524567765780717109616748933630364200317687291046055118737587697510939517252245710306646155772831436013971724481443654932630319085588147436112198934867224850036968074130558127066188475740553149587714112808551835880666012903651859580234129805580074844684526620091506655345299434455806896837926335229779632528684030400890708579038639280240022309690038032176604539091205540422068492362106868171343650410145963283813864374487990607671475570427243900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

Wenn Sie jedoch Guss es zu einem float erhalten Sie:

>>> float(2790**413) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: int too large to convert to float 

So ist der Fehler zeigt deutlich, dass nicht diese großen Zahlen umgehen kann als float s.

-1

Es könnte ein Fehler in der Mathematik-Bibliothek sein - außerdem ist Math.pow Art von redundanten, können Sie fourthNumber ** dee tun, anstatt

+3

Es ist kein Fehler. Das Ergebnis von '2790 ** 413' kann nicht als Float dargestellt werden. –

0

Willem, ** unterscheidet sich von Math.pow

Im Gegensatz zu Der integrierte Operator ** math.pow() konvertiert beide Argumente in float. Verwenden Sie ** oder die integrierte pow() -Funktion zum Berechnen exakter ganzzahliger Potenzen.

Sie können auch numpy verwenden, wenn Sie große Zahlen manipulieren müssen.

+0

in welcher Weise ist das nicht, was ich gesagt habe ... Die Antwort sagt "Math.pow" funktioniert auf Floats. Das heißt natürlich, dass es zuerst * konvertiert * es zu schweben ... –

+0

afaik numpy arbeitet mit 64-Bit-Zahlen, 'np.power (2790,413)' warnt, dass der Überlauf aufgetreten ist und gibt '-9223372036854775808' zurück, was falsch ist . –

+0

Entschuldigung, ich habe falsch verstanden, was Sie gesagt haben :) – Gloria