Schnellere Wurzelfunktion in C++
Übersicht

![]() |
luciferBetreff: Schnellere Wurzelfunktion in C++ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab gerade in einem C++ Buch eine Schnellere WurzelFunktion entdeckt. Nemesis hat gesagt man könnte C++ Funktionen auch in BMax verwenden. Also poste ich die hier einfach mal:
Code: [AUSKLAPPEN] float FastWurzelExact(float r) { if(r == 0.0f) { return 0.0f; } if( r < 0.0f) { r = -r; } float Value = r; float HalfValue = 0.5f*r; unsigned long *ptr = NULL; ptr = (unsigned long*)&r; *ptr = (0xbe6f0000 - *ptr) >> 1; float temp1Wurzel = r; temp1Wurzel *= 1.5f-temp1Wurzel*temp1Wurzel*HalfValue; temp1Wurzel *= 1.5f-temp1Wurzel*temp1Wurzel*HalfValue; return Value*temp1Wurzel; } |
||
Aktuelles Projekt:
Demonspawn RPG |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
naja ich denke kaum dass die schneller ist als die von GCC verwendete. Man muss nur die anderen Funktionen auch implementieren, also jene für Int und Float, da BM nur die Double benutzt welche logischerweise die langsamste ist. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Gombolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ausserdem glaube ich nicht das der Sinn dieses Forums ist Quellcodes aus Bücher hier reinzuposten.
Oder irre ich mich. |
||
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/ |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich frage mich immer wieder, was 0xbe6f0000 bedeuten soll? Was hat Wurzelziehen mit dieser Adresse zu tun?
Naja ansonsten denek ich mal, das die FPU selber ein Sqr Funktion besitzt, oder irre ich mich da? Jedenfalls wäre das die schnellere Variante. mfg olli |
||
vertex.dreamfall.at | GitHub |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Hui, das is ja ein ganz fieser Hack... :] Code: [AUSKLAPPEN] __declspec( naked ) float __fastcall S_InverseSqrtFast( float a ) { __asm { mov eax, 0be6eb508h mov DWORD PTR[ esp - 12 ], 03fc00000h sub eax, DWORD PTR[ esp + 4 ] sub DWORD PTR[ esp + 4 ], 800000h shr eax, 1 mov DWORD PTR[ esp - 8 ], eax fld DWORD PTR[ esp - 8 ] fmul st, st fld DWORD PTR[ esp - 8 ] fxch st( 1 ) fmul DWORD PTR[ esp + 4 ] fld DWORD PTR[ esp - 12 ] fld st( 0 ) fsub st, st( 2 ) fld st( 1 ) fxch st( 1 ) fmul st( 3 ), st fmul st( 3 ), st fmulp st( 4 ), st fsub st, st( 2 ) fmul st( 2 ), st fmul st( 3 ), st fmulp st( 2 ), st fxch st( 1 ) fsubp st( 1 ), st fmulp st( 1 ), st ret 4 } } float __fastcall S_Sqrt( float a ) { return a ? a * S_InverseSqrtFast( a ) : 0; } Wobei... Der GCC kann das glaub' ich garnich compilieren oder? Naja, wozu auch die Standardfunktionen überschreiben? ![]() grüße |
||
furbolg |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
0xbe6f0000 ist keine Adresse .... das ist eine Hex Zahl.
Jede Zahl kann eine Adresse sein muss es aber nicht .... Statt 0xbe6f0000 kannst du auch die Zahl dahin schreiben .... Is halt ne andere Form wie Binär ... |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
In dem Fall ist aber eine Adresse gemeint. grüße |
||
furbolg |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein ist es nicht.
*Ptr ist keine Adresse sondern liefert das Pointer Objekt .... Er bekommt nicht die Adresse sondern den Wert. Wäre doch schwachsinn, von einer festen Zahl eine Adresse abzuziehen.... Adressen ändern sich bei jedem Programmstart / jeder Variable. |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, ist wirklich keine Adresse, der Pointer wird ja diferenziert.
Die Funktion geht jedoch nicht. Ich kann mir aber auch nicht vorstellen, dass das funktionieren soll. Muss mal per IEEE Standard den Floataufbau auseinander klamüsern, und schauen, was da im eigentlichen gemacht wird. kurz noch zu lucifer: das ganze ist C nicht C++. mfg olli Edit: Code: [AUSKLAPPEN] float FastSqr( float arg )
{ float x, y; unsigned iarg = *((unsigned*)&arg); *((unsigned*)&x) = (0xbe6f0000 - iarg)>>1; y = arg*0.5f; x*= 1.5f - y*x*x; x*= 1.5f - y*x*x; return x; } Die funktion geht übrigens. Einbinden in Blitz: Code: [AUSKLAPPEN] Import "Test.c"
Extern Function FastSqr:Float(arg:Float) End Extern Print 1.0/FastSqr(25.0) (geht natürlich nru mit installierten C-Compiler) |
||
vertex.dreamfall.at | GitHub |
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
@furbolg: Stimmt hast recht, hab das nicht genau angeschaut... *g* grüße |
||
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
Nemesis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wth.
was hat das bios damit zu tun? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich denke er meint die Prozessorextensions MMX, SSE, SSE2, nicht BIOS | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
mangoo |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sieht doch schwer nach nem iterativen Algorithmus aus, müssta euch mal Numerik/Praktische Mathematik anschaun, da lernt man wie man iteratives Zeug und auch Approximationen und allsowat ermittelt. | ||
Black |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
http://www.math.purdue.edu/~cl...nvSqrt.pdf
Erklärt zumindest einen Magic-Number, vielleicht hilfts ja auch diesen zu verstehen (wenns nicht sogar der gleiche ist). |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group