gpt4 book ai didi

c - return 的简化版本 ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496

转载 作者:太空狗 更新时间:2023-10-29 15:28:34 25 4
gpt4 key购买 nike

我在 malloc.c 实现中找到了一些代码,谁能告诉我这段代码实际上做了什么:

return ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496

我做了一些搜索,发现它可以将整数转换为 IEEE 754 float ,但我无法理解它是如何工作的。谁能帮助我分多个步骤理解它?

最佳答案

这看起来有点像计算 4*log2x+12 或非常接近这个值的东西。

想法是使用硬件计算二进制对数,并使用位移来获取float 的指数部分,以及尾数的两个高位。

我写了一个小测试程序来比较上面的计算:

#include <stdio.h>
#include <stdint.h>
#include <math.h>

int makesize(uint32_t x) {
return ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496;
}

int main(void) {
for (uint32_t i = 1 ; i != 1000 ; i++) {
double v = i;
double x = log(v)/log(2);
int y = makesize(i);
int res= 12+((int)floor(4*x));
printf("%04d : %d,%d (%d)\n", i, y, res, y-res);
}
return 0;
}

Demo.

从 1 到 999 的运行产生了彼此在 1 以内的值。

关于c - return 的简化版本 ((union { float v; uint32_t r; }){(int)x}.r>>21) - 496,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39578884/

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