10#ifndef satoko__utils__sdbl_h
11#define satoko__utils__sdbl_h
39static inline word sdbl_exp(
sdbl_t a) {
return a >> 48; }
40static inline word sdbl_mnt(
sdbl_t a) {
return (a << 16) >> 16; }
42static inline double sdbl2double(
sdbl_t a) {
44 assert(sdbl_exp(a) < 1023);
45 temp.ui64 = ((sdbl_exp(a) + 1023) << 52) | (((a << 17) >> 17) << 5);
55 expt = (temp.ui64 >> 52) - 1023;
56 mnt = SDBL_CONST1 | ((temp.ui64 << 12) >> 17);
57 return (expt << 48) + mnt;
70 mnt = sdbl_mnt(a) + (sdbl_mnt(b) >> (sdbl_exp(a) - sdbl_exp(b)));
78 return (expt << 48) + mnt;
84 sdbl_t a_mnt, a_mnt_hi, a_mnt_lo;
85 sdbl_t b_mnt, b_mnt_hi, b_mnt_lo;
96 a_mnt_lo = (a_mnt<<32)>>32;
97 b_mnt_lo = (b_mnt<<32)>>32;
98 mnt = ((a_mnt_hi * b_mnt_hi) << 17) +
99 ((a_mnt_lo * b_mnt_lo) >> 47) +
100 ((a_mnt_lo * b_mnt_hi) >> 15) +
101 ((a_mnt_hi * b_mnt_lo) >> 15);
102 expt = sdbl_exp(a) + sdbl_exp(b);
110 return (expt << 48) + mnt;
115 if (sdbl_exp(a) >= (
word)deg2)
116 return ((sdbl_exp(a) - deg2) << 48) + sdbl_mnt(a);
120static inline void sdbl_test()
123 printf(
"%f\n", sdbl2double(ten100_));
126 printf(
"%f\n", sdbl2double(SDBL_CONST1));
127 printf(
"%f\n", sdbl2double(
ABC_CONST(0x000086BCA1AF286B)));
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
unsigned __int64 word
DECLARATIONS ///.
ABC_NAMESPACE_HEADER_START typedef word sdbl_t