Autocast vermeiden?

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
Magnum
User
Beiträge: 3
Registriert: Freitag 29. Oktober 2004, 20:22

Hallo,
ich habe folgenden Python-Code

Code: Alles auswählen

b = 1
c = 3
a = b/c
print("%f")%a
Es wird 0.000000 ausgegeben.

Wie kann ich erreichen, dass Python nicht a = 0.333333 setzt? Also nicht auf Integer castet. Das obere Codestück beschreibt ein komplizierteres Problem: Die Werte für b und c werden nämlich vorher berechnet und sind ganzzahlig.
Eine Antwort wie: "Schreib doch a = 1.0 / 3.0" hilft mir nicht weiter.

Danke für Eure Antworten.

Grüße
Magnum
Zuletzt geändert von Magnum am Freitag 29. Oktober 2004, 20:46, insgesamt 1-mal geändert.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Schreib doch: :D

Code: Alles auswählen

a = float(b) / float(c)
Gruß, mawe
Magnum
User
Beiträge: 3
Registriert: Freitag 29. Oktober 2004, 20:22

Hi mawe,
erstmal danke!
Es funktioniert teilweise, d.h. solange bis die die Zahlen b und c nicht zu groß werden. Ich berechne nämlich bei einer Variable die Fakultät, welche rasant steigt.
Muss ich mich damit zufrieden geben das es nicht mit sehr großen Zahlen funktioniert oder gibt es noch eine Lösung?

Magnum
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Magnum,

vielleicht könntest Du die Formel so umstellen, daß Du keine Division brauchst.
Milan hat mal eine Klasse für Brücher gepostet: http://python.sandtner.org/viewtopic.php?t=475
Die könnte da auch hilfreich sein.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Es reicht wenn Du nur eine Zahl als float nimmst.

Code: Alles auswählen

3/float(2) # -> 1.5
In deinem Fall könntest Du also die kleinere Zahl in float umwandeln. Die große bleibt dann long.
Oder mit Milan's Klasse, wie Dookie schon vorgeschlagen hat.

Gruß, mawe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Anderer Vorschlag, falls die Zahlen (speziell b) nicht abnormal groß sind:

Code: Alles auswählen

erg=a/b+(a % b)/float(b)
Damit sollten dann auch sehr große a gebändigt werden können. Aber sobald a zu groß wird geht das auch in die Hose, da dann das addieren fehlschlägt...
Zuletzt geändert von Milan am Freitag 29. Oktober 2004, 21:39, insgesamt 1-mal geändert.
Magnum
User
Beiträge: 3
Registriert: Freitag 29. Oktober 2004, 20:22

mawe hat geschrieben:Hi!

Es reicht wenn Du nur eine Zahl als float nimmst.

Code: Alles auswählen

3/float(2) # -> 1.5
In deinem Fall könntest Du also die kleinere Zahl in float umwandeln. Die große bleibt dann long.
Oder mit Milan's Klasse, wie Dookie schon vorgeschlagen hat.

Gruß, mawe
Das bringt nichts, sobald Python(übrigens auch so in C) float/long teilen muss, wird der Nenner auf float gecastet.

@Dookie
In meinem Fall ist eine Klasse zu verwenden, wie mit Kanonen auf Spatzen zu schießen.

Magnum
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Erscheint mir aber als logische Alternative, es sei denn du schreibst dir selbst eine Funktion, die schriftliche Division von (a%b)/b beherrscht. a/b kann ja Python selber :wink: ...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

@ Magnum: wenn die Spatzen groß genug sind ;)
Float und Long sind ja auch Klassen.


Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten