Float verhält sich unerwartet (wie integer?)

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
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

Ich habe schon viel auch in anderen Programmiersprachen mit floats programmiert, aber hier steh ich wohl völlig auf dem Schlauch?
Code:

Code: Alles auswählen

def gatePlausibleCheck(gateA, gateB, pos, scale):
	borderRight = pos + float(scale) * 10 / 2
	borderLeft = pos - float(scale) * 10 / 2
	print("gateA: {0:.9f} borderLeft: {0:.9f}".format(gateA, borderLeft))
	print("{}".format(abs(gateA - borderLeft) < 1.0E-06))
	print("{}".format(abs(gateA - borderLeft)))
	print("{}".format(gateA - borderLeft))
	print("{}".format(1.0E-06))
Ausgabe:

Code: Alles auswählen

gateA: -0.004450000 borderLeft: -0.004450000
False
4.999999999999796e-06
-4.999999999999796e-06
1e-06
Da muss doch 0, oder nahe 0 rauskommen.
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

Wow, bin ich da über etwas gestolpert:
Code:

Code: Alles auswählen

def gatePlausibleCheck(gateA, gateB, pos, scale):
	borderRight = pos + float(scale) * 10 / 2
	borderLeft = pos - float(scale) * 10 / 2
	print("gateA: {0:.9f} borderLeft: {0:.9f}".format(gateA, borderLeft))
	print("{0:.9f}".format(gateA))
	print("{0:.9f}".format(borderLeft))
Ausgabe:

Code: Alles auswählen

gateA: -0.004450000 borderLeft: -0.004450000
-0.004450000
-0.004445000
Ist das ein bug? Ich sehe hier keinen Fehler meinerseits.
Benutzeravatar
Dennis89
User
Beiträge: 1519
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

4.9e-06 (=0.0000049) ist doch Nahe 0. Schau dir doch mal die zwei Zahlen die du verrechnest vollständig an und nicht auf ein paar Stellen reduziert.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4529
Registriert: Freitag 17. April 2009, 10:28

@Hansi1350: Und du solltest ein Beispiel zeigen, in dem die Werte klar sind. Dann kann man die bei dem Verständnis helfen.
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hansi1350: Was ist denn `scale` für ein Datentyp? Ist der `float()`-Aufruf da wirklich nötig?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1224
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Du bist wahrscheinlich über eine Wissenslücke gestolpert: https://0.30000000000000004.com/
Außerdem verschweigst du gateA, gateB und scale. Was sind die Eingangswerte?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

Schaut mal in meinem 2. Post, da sieht man, wenn man genauer hinschaut (vorsicht mit den nullen), das die selbe variable, mit derselben formatierung, unterschiedliche werte ausgibt.
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

__blackjack__ hat geschrieben: Freitag 27. September 2024, 18:47 @Hansi1350: Was ist denn `scale` für ein Datentyp? Ist der `float()`-Aufruf da wirklich nötig?
Nein, ich habe nur in meiner Ratlosigkeit irgendwas probiert.
juwido
User
Beiträge: 24
Registriert: Donnerstag 15. Dezember 2022, 13:41

Hier wird der Wert "gateA" doppelt angezeigt.

Code: Alles auswählen

print("gateA: {0:.9f} borderLeft: {0:.9f}".format(gateA, borderLeft))
                                   X
print("gateA: {0:.9f} borderLeft: {1:.9f}".format(gateA, borderLeft)) 

Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier das Problem noch mal eingedampft und mit Zeichenketten, denn das hat mit dem Datentyp überhaupt nichts zu tun:

Code: Alles auswählen

In [18]: "{0} {0}".format("spam", "parrot")
Out[18]: 'spam spam'
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten