Seltsames Verhalten bei Potenzen(B3D Bug?)
Übersicht

![]() |
ChesterBetreff: Seltsames Verhalten bei Potenzen(B3D Bug?) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
irgendwie bin ich in BB auf ein recht sonderbares Verhalten gestoßen: BlitzBasic: [AUSKLAPPEN] Potenz = 5 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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 BY ♫ BinaryBorn - 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
|
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group