D equivalent of C++ reinterpret cast?

Bradley Mitchell abstractant1 at gmail.com
Sun Sep 19 10:39:38 PDT 2010


Hello,

I'm trying to implement the Quake 3 fast inverse square root algorithm which
requires casting from int to float without modifying the stored bits. A C++
reinterpret cast seems to accomplish this just fine but so far I have had no
success in D after trying quite a few different things. Here is the C++ I've
written that currently works:

#include <iostream>

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

    float const mx = 0.5f * MULT * x;
    int xi = *reinterpret_cast<int *>( &x );
    xi = INV_SQRT_N - (xi >> 1);
    x = *reinterpret_cast<float *>( &xi );
    return x * (1.5f * MULT - mx * x * x);
}

int main()
{
    float a = fastInvSqrt( 9.0f );
    std::cout << a << std::endl;
}

And here is my D code that doesn't work yet:

module test;

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)cast(void*)x;
    xi = INV_SQRT_N - (xi >> 1);
    x = xi;
    x = cast(float)cast(void*)xi;
    return x * (1.5f * MULT - mx * x * x);
}

void main(string[] args)
{
    float a = fastInvSqrt( 9.0f );
    writefln("%f", a);
}

For further reference, the wikipedia article on this algorithm can be found here:
http://en.wikipedia.org/wiki/Fast_inverse_square_root

and my C++ code is based on a slightly modified version described here:
http://www.ece.uwaterloo.ca/~dwharder/Algorithms_and_Data_Structures/Algorithms/Inverse_square_root/

As you can see, I'm not trying to convert an integer to an equivalent floating
point value but rather trying to coerce the variable to a float without
modifying the underlying bit sequence. Any help would be greatly appreciated!!

Thank you for your time,
Brad


More information about the Digitalmars-d-learn mailing list