繁体   English   中英

C++ 函数`modf` 在内部是如何工作的?

[英]How does the C++ function `modf` work internally?

我明白了它的作用,但我想知道该函数在内部做什么来分离浮点数。 我可以想到一种使用整数转换的非常hacky 的方法,但我真的希望它是一个比这更优雅的解决方案......它是否直接访问位并进行转换?

环顾四周,我找到了一个实现

#ifdef __STDC__
    double modf(double x, double *iptr)
#else
    double modf(x, iptr)
    double x,*iptr;
#endif
{
    int i0,i1,j0;
    unsigned i;
    i0 =  __HI(x);      /* high x */
    i1 =  __LO(x);      /* low  x */
    j0 = ((i0>>20)&0x7ff)-0x3ff;    /* exponent of x */
    if(j0<20) {         /* integer part in high x */
        if(j0<0) {          /* |x|<1 */
        __HIp(iptr) = i0&0x80000000;
        __LOp(iptr) = 0;        /* *iptr = +-0 */
        return x;
        } else {
        i = (0x000fffff)>>j0;
        if(((i0&i)|i1)==0) {        /* x is integral */
            *iptr = x;
            __HI(x) &= 0x80000000;
            __LO(x)  = 0;   /* return +-0 */
            return x;
        } else {
            __HIp(iptr) = i0&(~i);
            __LOp(iptr) = 0;
            return x - *iptr;
        }
        }
    } else if (j0>51) {     /* no fraction part */
        *iptr = x*one;
        __HI(x) &= 0x80000000;
        __LO(x)  = 0;   /* return +-0 */
        return x;
    } else {            /* fraction part in low x */
        i = ((unsigned)(0xffffffff))>>(j0-20);
        if((i1&i)==0) {         /* x is integral */
        *iptr = x;
        __HI(x) &= 0x80000000;
        __LO(x)  = 0;   /* return +-0 */
        return x;
        } else {
        __HIp(iptr) = i0;
        __LOp(iptr) = i1&(~i);
        return x - *iptr;
        }
    }
}

但不能确定这是否是目前使用的。 正如您所怀疑的,它与 cppreference 中给出的解释不同。 它直接操作浮点数中的位。 我没有研究这个优化代码的细节,但不怀疑任何特别深的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM