Seltsames Verhalten bei Potenzen(B3D Bug?)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Chester

Betreff: Seltsames Verhalten bei Potenzen(B3D Bug?)

BeitragSa, Okt 17, 2009 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

irgendwie bin ich in BB auf ein recht sonderbares Verhalten gestoßen:

BlitzBasic: [AUSKLAPPEN]
Potenz = 5

zahl1% = 18041011
zahl2% = 2^Potenz


;Alles das selbe
zahl3% = zahl1 - zahl2 ; richtiges Ergebnis
zahl4% = 18041011 - zahl2 ; richtiges Ergebnis

zahl5% = 18041011 - 2^Potenz ; falsches Ergebnis
zahl6% = zahl1 - 2^Potenz ; falsches Ergebnis
zahl7% = -2^Potenz +18041011 ; falsches Ergebnis



Print " "+zahl1
Print " "+zahl2
Print "------------"
Print "Richtig: "+zahl3
Print "Richtig: "+zahl4
Print "Falsch: "+zahl5
Print "Falsch: "+zahl6
Print "Falsch: "+zahl7

WaitKey()


Die mathematischen Ausdrücke sind alle die selben, aber probiert es selbst durch. Bei denen mit der Potenzfunktion direkt im Term sind die Ergebnisse einfach falsch. Confused
Und irgendwie kann ich mir da einfach keinen Reim draufmachen. Ich meine, sofern ich gerade keinen Matheblackout habe, müsste doch alles stimmen. Selbst die Integergrenzen werden ja bei weitem nicht überschritten...

Mfg
Chester

Hakkai

BeitragSa, Okt 17, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
float ist soweit ich weis generell Fehlerbehaftet bei gewissen Rechenoperationen, da er bei der Rechnung gewisse Sachen weglassen muss, genau kann ich dir das auch nicht beschreiben.

Aber das Problem ist wohl in jeder Programmiersprache das selbe.

Nicdel

BeitragSa, Okt 17, 2009 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso Float? Das sind alles Integer...
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Eingeproggt

BeitragSa, Okt 17, 2009 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Zahlen werden als Integer gespeichert, werden aber als Float berechnet, daher die Ungenauigkeit. Man probiere:

Code: [AUSKLAPPEN]
zahl5% = 18041011 - Int(2^Potenz)
zahl6% = zahl1 - Int(2^Potenz)
zahl7% = Int(-2^Potenz) +18041011


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Holzchopf

Meisterpacker

BeitragSa, Okt 17, 2009 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
2^Potenz liefert aber intern eine Float zurück. Hakai hat da schon recht. Blitz rechnet dann nämlich 18041011.00 -32.00, aufgrund des hohen Unterschieds im Wertebereich (damit meine ich, die eine ist im Bereich 1e7-1e8, die andere 1e1-1e2) kommts dann zu Ungenauigkeiten, wodurch einige Stellen verloren gehen.
Ist also kein Bug. Hier muss man nur richtig Casten.
BlitzBasic: [AUSKLAPPEN]
18041011 - Int(2^Potenz)

zum Beispiel liefert dann wieder ein richtiges Ergebnis.

mfG

edit
Gnaa, zu langsam =/
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
  • Zuletzt bearbeitet von Holzchopf am Sa, Okt 17, 2009 19:58, insgesamt einmal bearbeitet

hazumu-kun

BeitragSa, Okt 17, 2009 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kann sein das der Matheparser versagt hat bei dir, versuch testweise mal klammern zu setzten:
y= 10 - (x^2)

Scheint erstmal unnötig zu sein, aber vielleicht erklärt das etwas.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

D2006

Administrator

BeitragSa, Okt 17, 2009 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Es liegt wirklich an den Floats. Übrigens is das auch der Grund, warum es in BB schneller ist x*x statt x^2 zu schreiben. Da sonst erst zu Floats gecastet wird, was natürlich Zeit kostet und insbesondere wenn man nur Integer braucht total unnötig ist.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

BtbN

BeitragSo, Okt 18, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
x^2 ist generell enorm langsamer als ein simpeles x*x, selbst wenn x ein float ist.
Liegt daran, dass fürs potenzieren eine andere Routine in der CPU angesprochen wird(Von BB/BMax. C-Compiler z.B. optimieren ein x^2 noch vor dem eigentlichen compilieren weg und machen ein (x*x) draus), die enorm langsamer ist.
Und das sind nicht nur kleine, nicht merkbare nanosekunden-bruchteile, um die es da geht, es sind schon sehr deutlich merkbare unterschiede. Kann für BB jetzt leider keinen Benchmark vorlegen, da ich kein BB habe.

Nicdel

BeitragSo, Okt 18, 2009 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal kurz getestet:

x = 12345, 10000000 Durchläufe

x^2 benötigt 2911 ms.

x*x benötigt 29 ms.

Ein enormer Unterschied...

Testcode:
BlitzBasic: [AUSKLAPPEN]

x = 12345

time = MilliSecs()

For i = 0 To 9999999

y = x^2

Next

Print "x^2: "+(MilliSecs()-time)


time = MilliSecs()

For i = 0 To 9999999

y = x*x

Next

Print "x*x: "+(MilliSecs()-time)

WaitKey

End
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

TimBo

BeitragSo, Okt 18, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

das ist ja schon längst besprochen.

x^2 is daher langsamer , da die Potenzieren-Routine auch für bspw. x^3.23 funktionieren muss.
Daher auch immer beim Abstandberechnen durch Pythaguras immer a*a+b*b rechnen Smile

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 18, 2009 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Aus dem Gedächnis hab ich folgende Werte noch im Hinterkopf:

Ein 486er -Prozessor benötigt für eine ideal vorbereitete Berechnung...

- 2 bis 3 Taktzyklen für eine Addition / Subtraktion
- ca. 15 Taktzyklen für eine Multiplikation
- ca. 87 Taktzyklen für eine Division
- ca. 230 Taktzyklen für eine Potenzrechnung (oder war es Wurzel ziehen? Keine Ahnung, aber die Zahl stimmt wohl noch Laughing)

Mit Ideal meine ich, das die Werte schon im Register geschrieben sind und nicht erst aus irgendwelchen Speicherbereichen ausgelesen werden müssen. Das heisst also: Register A und Register B haben schon die Werte vorliegen und nun wird ein Softwareinterrupt ausgeführt.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSo, Okt 18, 2009 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
- ca. 15 Taktzyklen für eine Multiplikation
- ca. 87 Taktzyklen für eine Division

Das ist auch der Grund, wieso man bei sehr oft ausgeführten Codeteilen (etwa Vektornormalisierung) folgendes tun sollte Code: [AUSKLAPPEN]
Local Denominator# = Foo()
Local A# = A#/Denominator#
Local B# = B#/Denominator#
Local C# = C#/Denominator# ;Langsam

;Besser gehts so:
Local Denominator# = 1.0/Foo() ;Nur einmal dividieren und dafür 3 mal Multiplizieren
Local A# = A#*Denominator#
Local B# = B#*Denominator#
Local C# = C#*Denominator#
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group