Schnellere Wurzelfunktion in C++

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

lucifer

Betreff: Schnellere Wurzelfunktion in C++

BeitragDo, Jan 13, 2005 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 13, 2005 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 13, 2005 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Wink

grüße
 

furbolg

BeitragFr, Jan 14, 2005 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

In dem Fall ist aber eine Adresse gemeint.

grüße
 

furbolg

BeitragFr, Jan 14, 2005 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 14, 2005 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

@furbolg: Stimmt hast recht, hab das nicht genau angeschaut... *g*

grüße
 

lettorTrepuS

BeitragFr, Jan 14, 2005 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.
 

Nemesis

BeitragFr, Jan 14, 2005 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
wth.

was hat das bios damit zu tun?
 

Dreamora

BeitragFr, Jan 14, 2005 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 15, 2005 7:39
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

mangoo

BeitragFr, Feb 11, 2005 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Feb 13, 2005 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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).

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group