⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x-cvsweb-markup(47)

📁 软件浮点数计算功能
💻
📖 第 1 页 / 共 5 页
字号:
    doit(_FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1), _b_f0, _b_f1);   \    doit(_c_f1, _c_f0, X##_f1, Y##_f1);                                 \                                                                        \    _b_f0 &= -_c2;                                                      \    _b_f1 &= -_c1;                                                      \    __FP_FRAC_ADD_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \                    _FP_FRAC_WORD_4(_z,1), (_c1 & _c2), 0, _d,                \                    0, _FP_FRAC_WORD_4(_z,2), _FP_FRAC_WORD_4(_z,1));        \    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \                     _b_f0);                                                \    __FP_FRAC_ADDI_2(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),       \                     _b_f1);                                                \    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \                    _FP_FRAC_WORD_4(_z,1),                                \                    0, _d, _FP_FRAC_WORD_4(_z,0));                        \    __FP_FRAC_DEC_3(_FP_FRAC_WORD_4(_z,3),_FP_FRAC_WORD_4(_z,2),        \                    _FP_FRAC_WORD_4(_z,1), 0, _c_f1, _c_f0);                \    __FP_FRAC_ADD_2(_FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2),       \                    _c_f1, _c_f0,                                        \                    _FP_FRAC_WORD_4(_z,3), _FP_FRAC_WORD_4(_z,2));        \                                                                        \    /* Normalize since we know where the msb of the multiplicands       \       were (bit B), we know that the msb of the of the product is      \       at either 2B or 2B-1.  */                                        \    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                       \    R##_f0 = _FP_FRAC_WORD_4(_z,0);                                     \    R##_f1 = _FP_FRAC_WORD_4(_z,1);                                     \  } while (0)#define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y)                          \  do {                                                                  \    _FP_FRAC_DECL_4(_z);                                                \    _FP_W_TYPE _x[2], _y[2];                                            \    _x[0] = X##_f0; _x[1] = X##_f1;                                     \    _y[0] = Y##_f0; _y[1] = Y##_f1;                                     \                                                                        \    mpn_mul_n(_z_f, _x, _y, 2);                                         \                                                                        \    /* Normalize since we know where the msb of the multiplicands       \       were (bit B), we know that the msb of the of the product is      \       at either 2B or 2B-1.  */                                        \    _FP_FRAC_SRS_4(_z, wfracbits-1, 2*wfracbits);                       \    R##_f0 = _z_f[0];                                                   \    R##_f1 = _z_f[1];                                                   \  } while (0)/* Do at most 120x120=240 bits multiplication using double floating   point multiplication.  This is useful if floating point   multiplication has much bigger throughput than integer multiply.   It is supposed to work for _FP_W_TYPE_SIZE 64 and wfracbits   between 106 and 120 only.     Caller guarantees that X and Y has (1LLL << (wfracbits - 1)) set.   SETFETZ is a macro which will disable all FPU exceptions and set rounding   towards zero,  RESETFE should optionally reset it back.  */#define _FP_MUL_MEAT_2_120_240_double(wfracbits, R, X, Y, setfetz, resetfe)     \  do {                                                                          \    static const double _const[] = {                                            \      /* 2^-24 */ 5.9604644775390625e-08,                                       \      /* 2^-48 */ 3.5527136788005009e-15,                                       \      /* 2^-72 */ 2.1175823681357508e-22,                                       \      /* 2^-96 */ 1.2621774483536189e-29,                                       \      /* 2^28 */ 2.68435456e+08,                                                \      /* 2^4 */ 1.600000e+01,                                                   \      /* 2^-20 */ 9.5367431640625e-07,                                          \      /* 2^-44 */ 5.6843418860808015e-14,                                       \      /* 2^-68 */ 3.3881317890172014e-21,                                       \      /* 2^-92 */ 2.0194839173657902e-28,                                       \      /* 2^-116 */ 1.2037062152420224e-35};                                     \    double _a240, _b240, _c240, _d240, _e240, _f240,                            \           _g240, _h240, _i240, _j240, _k240;                                        \    union { double d; UDItype i; } _l240, _m240, _n240, _o240,                  \                                   _p240, _q240, _r240, _s240;                        \    UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0;                       \                                                                                \    if (wfracbits < 106 || wfracbits > 120)                                     \      abort();                                                                  \                                                                                \    setfetz;                                                                    \                                                                                \    _e240 = (double)(long)(X##_f0 & 0xffffff);                                  \    _j240 = (double)(long)(Y##_f0 & 0xffffff);                                  \    _d240 = (double)(long)((X##_f0 >> 24) & 0xffffff);                          \    _i240 = (double)(long)((Y##_f0 >> 24) & 0xffffff);                          \    _c240 = (double)(long)(((X##_f1 << 16) & 0xffffff) | (X##_f0 >> 48));       \    _h240 = (double)(long)(((Y##_f1 << 16) & 0xffffff) | (Y##_f0 >> 48));       \    _b240 = (double)(long)((X##_f1 >> 8) & 0xffffff);                           \    _g240 = (double)(long)((Y##_f1 >> 8) & 0xffffff);                           \    _a240 = (double)(long)(X##_f1 >> 32);                                       \    _f240 = (double)(long)(Y##_f1 >> 32);                                       \    _e240 *= _const[3];                                                         \    _j240 *= _const[3];                                                         \    _d240 *= _const[2];                                                         \    _i240 *= _const[2];                                                         \    _c240 *= _const[1];                                                         \    _h240 *= _const[1];                                                         \    _b240 *= _const[0];                                                         \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -