D equivalent of C++ reinterpret cast?
Steven Schveighoffer
schveiguy at yahoo.com
Mon Sep 20 04:19:29 PDT 2010
On Sun, 19 Sep 2010 13:39:38 -0400, Bradley Mitchell
<abstractant1 at gmail.com> wrote:
> 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 );
Note the use of pointers and address above?
> 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;
You forgot that here...
int xi = *cast(int *)(&x);
rule of thumb -- if you want to do a reinterpret cast, you usually must
take the address first. The compiler never tries anything tricky on
pointer casts.
-Steve
More information about the Digitalmars-d-learn
mailing list