Datentyp problem

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.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Yup, ich wollte das Problem auch nicht auf Python reduzieren. Ich bin mir bewusst, dass das in anderen Sprachen auch so ähnlich ist. Bei meiner fast täglichen Arbeit mit Koordinaten komme ich auch prima mit den floats aus. Dennoch ist das eine Problematik, die imo für viele erst einmal nicht offensichtlich ist. Als ich meine Klasse für das Rechnen mit Gewichten geschrieben habe, musste ich letztendlich auch auf das Decimal Modul zurückgreifen. Das Umrechnen in die SI Basiseinheit hat da auch zu Rundungsfehlern mit den "normalen" Floats geführt, so dass Vergleiche nicht so einfach möglich waren.
Tom_H
User
Beiträge: 13
Registriert: Sonntag 3. Juli 2011, 10:12

BlackJack hat geschrieben:@Tom_H: `math.sqrt()` ist zwar schnell, führt aber leider zum falschen Ergebnis:
Na gut - dann eben zu Fuß (super-einfachst-Version mit Newton) ....
Das war wahrscheinlich auch der eigentliche Inhalt der Aufgabe - die Schüler sollten mal "etwas zum Kauen" bekommen.

Code: Alles auswählen

x = 1
while True:
    x += 1
    temp = x * x - 1
    if (temp % 61) == 0:
        temp = temp / 61
        yap1 = temp / 2.0
        while True:
            yap2 = (yap1 + temp / yap1) / 2.0
            if (yap1 - yap2) < 0.8:
                break
            yap1 = yap2
        y = int(yap2)
        if y * y == temp:
            print x, y
            break
>> 1766319049 226153980

mfg, Tom
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Rettet nicht viel, aber ein wenig ;-)

Code: Alles auswählen

for x in itertools.count(2):
    temp = x * x - 1
    # usw...
Außerdem regt es problembaer auf :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
titus2000
User
Beiträge: 11
Registriert: Donnerstag 29. September 2011, 13:49

Moin moin,

Ich trau mich kaum zu fragen, wenn das schon so super einfach ist, doch erschließt sich mir der Sinn von yap1 und yap 2 nicht. Ist das das Newtonverfahren. Ich kenne das nur aus der Analysis. Wäre klasse,w enn du mir den Code erklären könntest, ich werkel schon länger an dem decimal-Modul rum, doch ist das aber ner gewissen Nachkommastelle nicht mehr genau.

Lg Alex
Tom_H
User
Beiträge: 13
Registriert: Sonntag 3. Juli 2011, 10:12

titus2000 hat geschrieben:Ich trau mich kaum zu fragen, wenn das schon so super einfach ist, doch erschließt sich mir der Sinn von yap1 und yap 2 nicht. Ist das das Newtonverfahren.
Genau das isser - wobei der hier zum Zweizeiler verkommt.
gesucht: y = sqrt(t) das ist gleichbedeutend mit: y² = t oder: y² - t = 0
Man muß also die Nullstellen von y² - t suchen.
Ver-Newtoned gibt das: yn+1 = (yn + t / yn) / 2

Für n=1: yapprox_2 = (yapprox_1 + t / yapprox_1) / 2
Jetzt machst Du noch aus yapprox_2 die Kurzform yap2 und "recyclest" in der Schleife die Indizes: ~1 ist immer der alte und ~2 ist immer der neue Wert
...damit sollte es lesbar sein.

Beim Abbruchkriterium "(yap1 - yap2) < 0.8" hätte ich auch 1.0 hinschreiben können. 0.8 schien mir im Sinne von Rechenfehlern sicherer. So eine einfache Parabel konvergiert auch so schön schnell und Narrensicher, daß das wurscht ist.
Wichtig ist noch, daß der Startwert rechts von der Nullstelle liegt. Damit werden die Näherungswerte stetig fallend und man kann auf Vorzeichenspiele und Fallunterscheidungen verzichten.

mfg, Tom
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Ich kenn das ganze als Heron-Verfahren: http://de.wikipedia.org/wiki/Heron-Verfahren
Ein Spezialfall vom Newton-Verfahren.

Grüße,
anogayales
Antworten