gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:45:25 24 4
gpt4 key购买 nike

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

最佳答案

环顾四周,我发现了一个实现 source ,

#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 中给出的解释不同。它直接操作 float 中的位。我没有研究这个优化代码的细节,但不怀疑有什么特别深入的地方。

关于c++ - C++ 函数 `modf` 在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com