Что делает *(1+(int*)&x) в libm от Sun (где x имеет тип double)?

Выражение

#define __HI(x) *(1+(int*)&x)

определено в математической библиотеке Sun, в fdlibm.h. Он используется в большинстве программ математической библиотеки Sun, например, для реализации sin(x)

    double y[2],z=0.0;
    int n, ix;

    /* High word of x. */
    ix = __HI(x);

    /* |x| ~< pi/4 */
    ix &= 0x7fffffff;
    if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);

В приведенном выше коде переменная x имеет тип double. Может ли кто-нибудь объяснить мне синтаксис выражения в __HI(x), В файле Readme библиотеки Sun написано __Hi(x) является

"старшая часть двойного х (знак, показатель степени, первые 21 значащий бит)".

Я просто не понимаю синтаксис *(1+(int*)&x)и почему это соответствует x Высшая часть. Любое уточнение?

1 ответ

Решение

Это:

*(1+(int*)&x)

Значит: взять адрес х (&x), приведите его как указатель на int (int*), добавьте 1 и разыменуйте полученный указатель. Предполагая, что Sun использует этот формат, это означает, что значение в памяти выглядит следующим образом:

<sign (1 bit)><exponent (11 bits)><significand (52 bits)>

Если sizeof(int) 32 бита, это найдет местоположение double в памяти, затем увеличить указатель на следующий int, который содержит знак, показатель степени и первые 21 бит числа.

Другие вопросы по тегам