Einfache Rechnung: Ergebnis muss Fliesskommazahl sein

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
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mittwoch 14. November 2007, 19:10

Hallo

Ich arbeite gerade an einem Projekt (welches ich auch bald vorstellen werde ;)) das mit Formeln hantiert.

Folgender String kommt von einer Fremdeingabe:

Code: Alles auswählen

W = 1/2 * m * v ** 2
Variable m und v sind definiert:

Code: Alles auswählen

m = 1.0
v = 2.0
Nun wird der obere String (Formel) mittels "exec" ausgeführt. Folglich wird in der Variable "W" das Resultat gespeichert. Dummerweise ist dies 0 anstatt 2. Ich weiss auch wieso: Nur wenn die Faktoren Fliesskommazahlen sind, wird das Ergebnis eine Fliesskommazahl. Nur blöderweise kann ich die Faktoren nicht ändern, die sind so fest.

Wie kann ich python trotzdem zwingen, das Resultat 2.0 zu speichern?

Grüsse
Pot
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Mittwoch 14. November 2007, 19:13

Code: Alles auswählen

m = 1.0
v = 2.0
exec("W = 1.0/2.0 * m * v ** 2.0")
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mittwoch 14. November 2007, 19:17

Jup, das ist mir schon klar. Dummerweise bekommt das Skript nur "W = 1/2 * m * v ** 2" und nicht "W = 1.0/2.0 * m * v ** 2.0"

Grüsse
Pot
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Mittwoch 14. November 2007, 19:18

Darfst du den String manipulieren? Wie laeuft das ueberhaupt ab... wie "bekommt" dein Script diesen String?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mittwoch 14. November 2007, 19:19

nkoehring hat geschrieben:Darfst du den String manipulieren? Wie laeuft das ueberhaupt ab... wie "bekommt" dein Script diesen String?
Ja, darf ich, sofern er noch korrekt bleibt. Dieser String wird früher eingelesen von einer XML Datei. Diese Datei beinhaltet die Formeln sowie alle Auflösungen für die anderen Variablen.

Grüsse
Pot
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 14. November 2007, 19:44

Hilft dir das vielleicht ?

Code: Alles auswählen

In [6]: from __future__ import division

In [7]: 1/2
Out[7]: 0.5
BlackJack

Mittwoch 14. November 2007, 19:48

Das sollte helfen. Ausserdem ist es keine so gute Idee einfach irgendwelchen fremden Code im Namensraum des Moduls oder der Funktion auszuführen. ``exec()`` nimmt auch ein oder zwei Dictionaries entgegen, die als globaler und/oder lokaler Namensraum benutzt werden:

Code: Alles auswählen

from __future__ import division

def main():
    namespace = dict(m=1.0, v=2.0)
    formula = 'W = 1/2 * m * v ** 2'
    exec(formula, namespace)
    print namespace['W']

if __name__ == '__main__':
    main()
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mittwoch 14. November 2007, 20:08

Danke Zap.
BlackJack hat geschrieben:Ausserdem ist es keine so gute Idee einfach irgendwelchen fremden Code im Namensraum des Moduls oder der Funktion auszuführen. ``exec()`` nimmt auch ein oder zwei Dictionaries entgegen, die als globaler und/oder lokaler Namensraum benutzt werden:
Danke BlackJack für die Ergänzung mit dem Namespace, das kann ich sehr gut gebrauchen und muss auch keine Angst mehr haben, dass es eventuell schon vorhandene Variablen (z.B. Zählvariablen) überschrieben werden.

So gefährlich jedoch ist es nicht, da das Script eigentlich die Variable (W) und die Formel (1 / 2 * v ** 2) von zwei verschiedenen Strings einliest, ein Gleichheitszeichen dazwischen fabriziert und erst dann ausführt.

Freundliche Grüsse
Pot
Zuletzt geändert von pot am Mittwoch 14. November 2007, 20:10, insgesamt 1-mal geändert.
BlackJack

Mittwoch 14. November 2007, 20:20

Berühmte letzte Worte. ;-)

Die zweite Zeichenkette könnte ja auch so aussehen: '1 / 2 * v ** 2; wichtiger_name = 42'
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mittwoch 14. November 2007, 20:27

BlackJack hat geschrieben:Die zweite Zeichenkette könnte ja auch so aussehen: '1 / 2 * v ** 2; wichtiger_name = 42'
:o oder '1 / 2 * v ** 2; os.system("halt")' -.-
Okay ich weiss, ist unsicher ;-)

Danke für den Hinweis.

Grüsse
Pot
Antworten