Что делает *(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 бит числа.