-1

重複の可能性:
John Carmack の異常な高速逆平方根 (Quake III)

最近ブログでこのコードを見つけました - これは Quake3 Engine からのものです。これは、ニュートン ラプソン法を使用して逆平方根を高速に計算するためのものです。

float InvSqrt (float x){
    float xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i>>1);
    x = *(float*)&i;
    x = x*(1.5f - xhalf*x*x);
    return x;
}

する理由は何int i = *(int*)&x;ですか?代わりに行うint i = (int) x;と、まったく異なる結果が得られます。

4

3 に答える 3

7

int i = *(int*)&x; は、「float 値 x を構成する 4 バイトを取得し、それらを int として扱う」と述べています。float 値と int 値は、まったく異なる方法で格納されます (たとえば、int 4 と float 4.0 ではビット パターンがまったく異なります)。

于 2010-08-10T19:03:39.607 に答える
7

int i = *(int*)&x;は intに変換されません。これが行うのは floatxの実際のビットxを取得することです。これは通常、予想とはまったく別の 4 バイト値として表されます。

参考までに、float 値がメモリ内でどのように表現されるかを正確に理解していない限り、これを行うのは非常に悪い考えです。

于 2010-08-10T19:04:38.703 に答える
2

で終わる数値は、x の数値のIEEE浮動小数点表現のiバイナリ値です。リンクは、それがどのように見えるかを説明しています。これは一般的な C のイディオムではなく、SSE 命令が市販の x86 プロセッサに追加される前からの巧妙なトリックです。

于 2010-08-10T19:26:50.040 に答える