Language features and reinterpret casts

Adam D. Ruppe destructionator at gmail.com
Mon Sep 20 15:09:19 PDT 2010


On Mon, Sep 20, 2010 at 05:52:06PM -0400, bearophile wrote:
> Recently Bradley Mitchell in D.learn newsgroup has tried to implement the Quake fast inverse square root algorithm in D, and has found D lack the C++ reinterpret cast:
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=21901

Did anyone suggest porting the C++ line for line?

 int xi = *reinterpret_cast<int *>( &x );

and

 int xi = cast(int)cast(void*)x;

aren't the same thing!


Maybe he tried this, but webnews is crap and won't load up the rest of that
thread.

It seems like

  int xi = * cast(int*) (&x);

should do the trick. And same for the cast back to float.


So the final program is:

============

import std.stdio;

float fastInvSqrt( float x )
{
    const int INV_SQRT_N = 1597292357;
    const float MULT = 1.000363245811462f;

    float mx = 0.5f * MULT * x;
    int xi = * cast(int*) (&x);  /// note this line!
    xi = INV_SQRT_N - (xi >> 1);
    x = xi;
    x = * cast(float*) (&xi); /// this one too!
    return x * (1.5f * MULT - mx * x * x);
}

void main(string[] args)
{
	float a = fastInvSqrt( 9.0f );
	writefln("%f", a);
}
===========
Running it gives the same result as the C++ version on my box.

This looks like human error in the porting to me.



More information about the Digitalmars-d mailing list