Float in Int abbilden

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.
spongebob.squarepants
User
Beiträge: 54
Registriert: Freitag 22. Mai 2009, 12:59

Hallo Forum,

ich beschäftige mich derzeit mit einem Chip, der einen Python 1.5.2 Interpreter beinhaltet. Leider unterstützt die dort verwendete Python Version keine floats, so dass ich mir eine kleine Emulatorklasse gebaut habe, die sehr problemangepasst Add, Mul und Div unterstützt.

Nun kommt eine neue Anforderung: Es werden SQRT und POW benötigt. Hier frage ich mich, ob es da nicht bereits "was von Ratiopharm" gibt, also eine kleine, leichte float Emulator-Lib in Python.

Kennt da jemand was?
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

was ist das denn für ein "chip" von dem du da sprichst. das problem wirst du ja nicht alleine haben, da wird es sicher was geben.

oder aber:
http://en.wikipedia.org/wiki/Methods_of ... uare_roots
http://www.kinderpornos.info
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Vermutlich ein eher schlechter Tip: es gibt ja schon eine Bibliothek für Fließkomma-Zahlen in der StdLib - nämlich decimal. Die Berechnungen darin werden auch über int's abgebildet. Allerdings ist es natürlich alles auf das Dezimalsystem ausgerichtet und entsprechend langsam. Aber vielleicht kannst du dir ein paar Anregungen holen.

MFG HerrHagen
BlackJack

Ansonsten kann man mal im Netz nach Bibliotheken suchen, die Gleitpunktzahlen und Operationen in Software nachbilden, bzw. auch nach ähnlichen Bibliotheken für Festpunktzahlen suchen.

Die Laufzeitbibliothek vom GCC sollte zum Beispiel für beides Quelltext enthalten.
spongebob.squarepants
User
Beiträge: 54
Registriert: Freitag 22. Mai 2009, 12:59

Hallo,
vielen Dank für die Antworten. Der Chip ist einer von Telit http://www.telit.com. Die Python Version auf dem Chip nennen die EasyScript, und explizit erwähnt ist, das float nicht geht.

@HerrHagen: Gibt es Decimal nicht erst seit 2.4?

@BlackJack: Habe ich schon gemacht, ohne grossen Erfolg. Ist mit GCC der GNU C-Compiler gemeint?

Grüsse
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

spongebob.squarepants hat geschrieben:@HerrHagen: Gibt es Decimal nicht erst seit 2.4?
Ich denke es ging ihm da mehr um eine Anlaufstelle zum abschaun ;)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

@spongebob.squarepants: Stimmt. Allerdings ist es ja reiner Python-Code den du dir einfach aus dem entsprechenden Verzeichnis deiner Python-Installation nehmen kannst. Dennoch musst du ihn wahrscheinlich für Version 1.5.2 anpassen. Keine Ahnung wie aufwändig das in dem Fall wird. Vieleicht finden sich auch backports für ältere Versionen im Netz. Ansonsten hilft dir vieleicht noch das.

EDIT: @Cofi: so wars gemeint.
spongebob.squarepants
User
Beiträge: 54
Registriert: Freitag 22. Mai 2009, 12:59

Hmm. Okay. Habe gerade mal bei 2.6.2 nachgeschaut. Die Source ist ca. 200 k gross. Und so recht überschaue ich nicht, was da alles im 1.5.2 fehlen mag. Aber Danke für den Tipp.

EDIT: Scheitert schon an diversen, nicht vorhandenen imports... Also das ist mir doch etwas zu aufwändig...



Grüsse
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

spongebob.squarepants hat geschrieben:@BlackJack: Habe ich schon gemacht, ohne grossen Erfolg. Ist mit GCC der GNU C-Compiler gemeint?
Ja, wobei mich auch interessieren würde, wo das in den Bibliotheken zu finden ist. Ich habe es bei einiger Suche gerade nämlich nicht gefunden ... ;-)

Gruß,
Christian
BlackJack

Die Suche 'gcc floating emulation' bei http://www.clusty.com/ gab als zweiten Treffer die API-Beschreibung: http://gcc.gnu.org/onlinedocs/gccint/So ... tines.html

Die Funktionen müssen allerdings nicht auf allen Systemen vorhanden sein, weil die ja eigentlich nur für Zielplattformen relevant sind, die keine FPU haben.

Man müsste da also schon im Quelltext vom GCC danach suchen. Aber das ist ja auch genau dass, was für spongebob.squarepants von Interesse wäre.
spongebob.squarepants
User
Beiträge: 54
Registriert: Freitag 22. Mai 2009, 12:59

Ja, die Beschreibung hatte ich dann auch gefunden. Danke noch einmal. Bin leider noch nicht weiter. Einen interessanten _anderen_ Ansatz (als meinen eigenen, der im Grunde nur die aus der Schulmathematik bekannte "schriftliche Division und Multiplikation" umsetzt), habe ich hier gefunden: http://www.nmt.edu/tcc/help/lang/python ... /rational/. Leider läuft das Dingens schnell in den Integer-Overflow, wenn es etwas mehr Präzision (sprich: Nachkommastellen) geben soll.

EDIT: Huiiii. Ein cast auf long war aber selten so hilfreich :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wahrscheinlich verstehe ich die Anforderung nicht, aber da doch `**` auch schon in Python 1.5 existierte und du ja nur Ganzzahlen hast, ist dies doch eine (wenn auch nicht so effiziente Implementierung von `pow`):

Code: Alles auswählen

def pow(x, y, z=None):
    if z is None: return x ** y
    return (x ** y) % z
Und der naive Ansatz für sqrt wäre doch dies

Code: Alles auswählen

def sqrt(x):
    if x < 0: raise ValueError, "math domain error"
    i = 1
    while i * i <= x:
        i += 1
    return i - 1
Besser kann man mit einer binären Suche werden. Das überlasse ich anderen.

Stefan
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

So wie ich es verstanden habe, hilft "**" nur bedingt, weil er ja gar nicht mit floats rechnen kann. Um z.B. 4.5089**8 zu berechnen, müsste er die Basis erst als int repräsentieren, damit dann potenzieren und das Ergebnis wieder als float darstellen.

Für sqrt() würde ich das Heron-Verfahren empfehlen. Das ist simpel und konvergiert sehr schnell.

Die Grundidee ist immer die gleiche: Man führt die ganzen Berechnungen zunächst mit Brüchen durch und wandelt dann am Ende den Bruch in eine float-Repräsentation.

Aber, ich glaube, das zu implementieren war auch nicht das Problem des OP, sondern eher die Frage, ob er sich das sparen kann, weil es schon etwas entsprechendes gibt ....
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

gibt es keine mailinglist zu diesem uc?
es gibt da sicher schon eine lösung. oder der uc hat keine community und ist daher nicht empfehlenswert.

was willst du überhaupt damit machen?

ich bin da evtl etwas konservativ, aber ich sehe nicht warum man einen uc mit python programmieren sollte.

wenns wirklich noch nix gibt und du mit deiner bisherigen implementierung zufrieden bist, dann fehlt dir ja nurnoch sqrt. sehe nicht, warum du das nicht auch noch selbst schreiben solltest. newton-verfahren ist easy und schnell.
http://www.kinderpornos.info
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

@spongebob.squarepants: vieleicht kannst du ja mal posten was du schon hast (Add, Mul, Div). Dann würde man besser verstehen wie du die floats mit ints abbildest und könnte direkt auf diese Implementierung hinarbeiten.
BlackJack

@Dill: Ketzer! Natürlich weil Python die beste Sprache ist wo gibt. :-D
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

sorry hoffe das zieht jetzt keinen ban nach sich? :oops:
http://www.kinderpornos.info
spongebob.squarepants
User
Beiträge: 54
Registriert: Freitag 22. Mai 2009, 12:59

Wow, ziemlich viele Antworten für nur eine Benachrichtigung. Danke dafür. Sammelantwort folgt:

@sma: Ja, ** würde helfen, danke noch mal für den Hinweis. Bei sqrt fehlen die Fractions. Meine float Repräsentation basiert auf einem long als Vorkomma-Teil und einem sechstelligen long als Nachkommawert.

@numerix: Das Heron Verfahren (ist das die babylonische Wurzel?) konvergiert gut, tendiert aber bei Verwendung des Rational Datentyps (siehe mein letztes Posting), den ich ganz schick finde, selbst bei Verwendung von longs schnell zu Long Overflows, vornehmlich bei dem additiven Part (schon getestet). Aber wenn Du da andere Erfahrungen hast, würde es mich freuen, davon zu hören. Zieht man die Sache mit float durch, ist das Verfahren brauchbar.

@Dill: Mit dem Chip hat das nichts zu tun, es ist ja ein reines in Python 1.5.2 zu lösendes Thema. Firmware für diesen Chip bedarf i.d.R. nicht der float Operation und der Schluss, wenn da keine drüber redet, taugt der nix, ist fraglich. Warum der in Py programmiert wird? Weil der nichts anderes kann (glücklicherweise, wer wünscht sich schon C o.ä., wenn er Py haben kann...). Selbst schreiben ist ja ok. Die Frage war ja: Gibt's da was von Ratiopharm?

@HerrHagen: OK, wie gesagt, extrem problemangepasst. Ich muss positive floats nur mit positiven ints addieren, multiplizieren und dividieren. Wie oben dargestellt, werden Vor und Nachkommastellen in jeweils einem Long abgebildet. Addition und Multiplikation behandeln beide Teile separat, um Überläufe zu vermeiden, und beachtet den Übertrag vom Nachkomma in den Vorkommateil. Die Division ist eine 1:1 Umsetzung der bekannten schriftlichen Division aus der Grundschule. Für SQRT gibt es ja eigentlich auch ein schriftliches Verfahren, ich bin eben nur faul respektive will nicht das Rad nochmal erfinden.

Grüsse und Danke für die Diskussion.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

spongebob.squarepants hat geschrieben:
@Dill: Mit dem Chip hat das nichts zu tun, es ist ja ein reines in Python 1.5.2 zu lösendes Thema. Firmware für diesen Chip bedarf i.d.R. nicht der float Operation und der Schluss, wenn da keine drüber redet, taugt der nix, ist fraglich. Warum der in Py programmiert wird? Weil der nichts anderes kann (glücklicherweise, wer wünscht sich schon C o.ä., wenn er Py haben kann...). Selbst schreiben ist ja ok. Die Frage war ja: Gibt's da was von Ratiopharm?
naja, so ungewöhnlich ist der bedarf an decimal-operationen im embedded bereich ja nun nicht. und ich bleibe dabei, wenn dieses thema in der community noch nicht aufgetaucht ist, muss die sehr klein sein, was mich davon abstand nehmen lassen würde diese technik einzusetzen. ich weiss ja nicht was du damit machst, aber insb. ein professioneller einsatz verbietet sich dann einfach.
ich bin eigentlich ganz glücklich mit C. python ist eine wunderbare sprache, aber auf einem uc will ich die nicht.
http://www.kinderpornos.info
BlackJack

@spongebob.squarepants: Also bei Python's `long`\s dürfte es nicht zu Überläufen kommen, höchstens zu Speicherüberläufen. ;-)
Antworten