2021-04-27 18:33:31 +02:00
|
|
|
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
|
|
|
|
#include <math.h>
|
|
|
|
|
2022-04-15 11:00:55 +02:00
|
|
|
double frexp(double x, int* exptr)
|
2021-04-27 18:33:31 +02:00
|
|
|
{
|
2022-04-15 11:00:55 +02:00
|
|
|
union {
|
|
|
|
double d;
|
|
|
|
unsigned char c[8];
|
|
|
|
} u;
|
2021-04-27 18:33:31 +02:00
|
|
|
|
2022-04-15 11:00:55 +02:00
|
|
|
u.d = x;
|
|
|
|
/*
|
|
|
|
* The format of the number is:
|
|
|
|
* Sign, 12 exponent bits, 51 mantissa bits
|
|
|
|
* The exponent is 1023 biased and there is an implicit zero.
|
|
|
|
* We get the exponent from the upper bits and set the exponent
|
|
|
|
* to 0x3fe (1022).
|
|
|
|
*/
|
|
|
|
*exptr = (int)(((u.c[7] & 0x7f) << 4) | (u.c[6] >> 4)) - 1022;
|
|
|
|
u.c[7] &= 0x80;
|
|
|
|
u.c[7] |= 0x3f;
|
|
|
|
u.c[6] &= 0x0f;
|
|
|
|
u.c[6] |= 0xe0;
|
|
|
|
return u.d;
|
2021-04-27 18:33:31 +02:00
|
|
|
}
|