2016-04-01 11 views
0

Ich möchte einen Power-Betrieb in Kombination mit einem Modulo durchführen. Ich habe Schwierigkeiten, diese pow() Funktion mit reellen Zahlen durchzuführen.Wie berechnet man pow() mit Modulo für reelle Zahlen?

Dies funktioniert gut für ganze Zahlen:

pow(2,6000,400) = 176 

Doch diese gibt einen Fehler mit reellen Zahlen:

pow(1.4142, 6000, 400) 

Ich habe auch die math.pow() Funktion versucht, aber es funktioniert nicht entweder Arbeit. .. wie kann ich das mit reellen Zahlen arbeiten lassen?

+0

Welche Programmiersprache verwenden Sie? –

+0

verwende nur VB und Python – Amy

Antwort

2

Die Python-Funktion pow() akzeptiert 2 oder 3 Argumente. In Ihrem Fall pow(x,y,z) tut x Leistung y und wendet ein Modulo z auf das Ergebnis an. Aber die documentation ist eindeutig:

Wenn das zweite Argument negativ ist, muss das dritte Argument weggelassen werden. Wenn z vorhanden ist, müssen x und y ganzzahlige Typen sein, und y muss nicht negativ sein.

So:

  • Ihr erster Anruf funktioniert gut, weil die Argumente mit den Anforderungen entsprechen. Beachten Sie, dass trotz pow(2,6000) eine große Zahl ist, das Ergebnis der kombinierten Modulo-Operation kann einfach ohne Überlauf berechnet werden, durch Verwendung von Eigenschaften auf modular exponentiation von ganzen Zahlen.

  • Ihr zweiter Aufruf schlägt mit einem Fehler fehl, weil das erste Argument keine ganze Zahl ist. Die Problemumgehung wäre, Ihre Operation in pow(1.4142,6000) % 400 zu zerlegen, da modulo für reelle Zahlen definiert ist.
    Leider ist pow(1.4142,6000) zu groß und verursacht einen Überlauffehler. Dies liegt daran, dass im Gegensatz zu den Python-Integern, die von unbegrenzter Reichweite sind, real numbers are limited durch den Bereich der C-Gleitkomma-Codierung.

P. S .: Ich nahm an, dass es über Python und nicht VB, weil VB's pow() nur zwei Argumente akzeptiert.

Edit: Hinweis für eine Abhilfe

Hier ein wenig Abhilfe, die sich die Tatsache zunutze macht, dass eine Fließkommazahl ist keine mathematische echte unbegrenzter Präzision, sondern eine rationale Zahl technisch. Wir können dann die Verwendung des Zähler und Nenner machen und Integer-Operationen verwenden, um die große Zahl zu meistern:

n=pow(14142,6000)   # take the first argument multiplied by a 10 exponent to make it an integer 
d=pow(10000,6000)   # keep track of this 10 exponent 
i=n//d     # integer division to compute the integral value 
r=n-d*i     # remainder of the integer division 
precision=6    # precision 
f=r*pow(10,precision)//d # keep the 6 most significant digits 
result=(i%400)+(f/pow(10,precision)) 

Das Ergebnis 271,048181 an die 6. Stelle ist. Ich lasse Sie als Übung das Schreiben einer Funktion, die dies auf eine weniger handwerkliche Weise durchführt.

+0

Das hilft so viel !!!! Vielen Dank!!! :) Wird damit experimentieren. – Amy

+0

Christophe, könnten Sie mir sagen, wie genau Sie meinen, dass der Rückgabewert von "271.04" wäre? Wäre es sehr genau? – Amy

+0

Gemäß den [Regeln der Fehlerausbreitung] (http://www.fas.harvard.edu/~scphys/nsta/error_propagation.pdf) ist es +/- 0,4243, so dass der genaue Wert zwischen 270,62 und 271,48 liegen sollte – Christophe

Verwandte Themen