【发布时间】:2020-10-14 22:08:25
【问题描述】:
所以我得到了
const int mask = 0x7F800000
const int shift = 23
const int bias = 127
int exp (float number) {
unsigned int u = *(unsigned int*)&number;
int field = 0;
老实说,我只是对如何正确格式化以获得我想要的东西感到困惑。本质上,客户端输入一个浮点数,然后 u 是与浮点数具有相同位模式的无符号整数。
我知道我需要首先屏蔽除数字中的指数变量之外的所有内容。所以我认为它是
field = (u & mask)
这大概应该掩盖位模式,除了我们想要的部分 - 指数。
然后第二步是将它移动 23,所以它不会被所有的零包围......这就是我感到困惑的地方。
field = (u & mask) >> shift ???
看,我有点迷路了。也许这是对的。不管怎样,我们都向右移动了 23 个。
那么最后是考虑偏差。您想返回实际指数,而不是位。这样做的公式是指数位=(exp位模式)-偏差......所以我试试这个
field = ((u & mask) >> shift) - bias;
return(field);
而我就是无法得到正确的答案。首先,请在我的格式上放轻松。我是 C 新手,这是一个初学者项目。我知道这并不好。但是,有人可以帮助我理解格式以使这些步骤起作用吗?或者帮助我缺少什么?我只是在寻求逻辑方面的帮助。
【问题讨论】:
-
屏蔽、移位和减法是正确的,即使 C 标准没有定义别名,许多 C 实现也会容忍别名,尽管有更好的方法。因此,可能还有其他原因导致“我无法得到正确的答案”。编辑您的问题以显示minimal reproducible example,包括完整的程序、示例输入、观察到的输出和所需的输出。仅仅说“我就是无法得到正确的答案”并不是一个充分的问题描述。显示程序产生的错误答案和正确答案的具体案例。
-
我会尝试一下。这是一个更大问题的一部分,所以问题可能是其他问题还没有完成。如果我提供的内容是正确的,我会继续看看测试是否满意。如果没有,我会回到这里。但是测试很简单......比如 6 == 6, 12 == 12。我是新手,所以我很困惑,所以我很抱歉