math.pow() .vs pow() - was stimmt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Pythagoraze
User
Beiträge: 10
Registriert: Dienstag 9. Februar 2021, 10:01

Moin.
vorab , fiel mir grade auf:

Die Regeln
https://wiki.python-forum.de/Forum/Regeln
im Post
viewtopic.php?t=17644
sind irgendwie nicht mehr da.

Seite wurde nicht gefunden
Die Verbindung mit dem Server wiki.python-forum.de schlug fehl.

_______________________________________________________

Meine Frage ist eigentlich eine triviale. (sorry)

Code: Alles auswählen

import math
n = 652143543
a = 356464641
z = (math.pow(a, 2)) % n # z = (pow(z, 2 , n))
z2 = (pow(a, 2,n))  # z = (pow(z, 2 , n))
> 566571737.0
> 566571738

Bei kleinen Zahlen funktioniert es richtig und bringt gleiche Ergebnisse.
Bei größeren, wie oben, kommen diese abweichenden Ergebnisse. (wie im oben: 37.0 vs. 38 )
Bei noch größeren kommen völlig andere Ergebnisse raus.
(
n = 6521435434356445
a = 3564646415263446 ergibt:
>>> 4575771299225419.0
>>> 3456456392333871
)

Also ich weiß aus anderen Sprachen, wie Javascript, daß es Rundungsfehler gibt, wenn man bestimmte Operationen wie Divisionen durchführt.
Aber ich dachte, daß Python da (und gerade in der math Bib) beim Potenzieren solche Fehler nicht machen würde.
Ich weiß jetzt nicht mehr, welches Ergebnis richtig ist.
Ich vermute, daß pow() (mittlerweile) präziser ist, als math.pow() und das richtige Ergebnis liefert.
Leider weiß ich gerade nicht mehr, in welchen Quellen (Büchern, Seiten) ich wegen dem Rundungsphänmen nachschlagen soll. Hab das nur mal irgendwo bei Thomas Theis in seinem Buch gelesen.

auf welchen Befehl (pow/mathpow) soll ich vertrauen? (vom Gefühl her auf pow() )
Könnt Ihr mir helfen?
Danke (hoffe, die Frage ist nicht zu doof.
#~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
# - mein Python is nur so gut, wie ich - #
#~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

♪ ♫ Nuuull-Hundert-Neunzich-Draaiii-Drei-Drei .... ♪ ♫ ♪
Kyrus86
User
Beiträge: 6
Registriert: Samstag 21. Oktober 2023, 13:04

Hallo Pythagoraze,

du hattest schon die richtige Idee.

math.pow(x, y) konvertiert laut Python Hilfe die Eingabewerte in float während pow(x, y) und x ** y eine Integerberechnung verwenden.

https://docs.python.org/3/library/math.html#math.pow

pow(x, y) und x ** y liefern also die korrekten Ergebnisse, math.pow hat die float Konvertierungsfehler.

Grüße
Antworten