gpt4 book ai didi

c - float 的按位乘法

转载 作者:行者123 更新时间:2023-11-30 16:59:03 26 4
gpt4 key购买 nike

我正在开展一个学校项目,该项目要求我仅使用 float 的二进制表示形式来操作 float ,特别是将 float 乘以二。我应该仅使用位操作 (! | ^ & ~)、逻辑运算符 (&&、||) 和 if/while 表达式来复制以下代码的功能。

但是,我遇到了一些问题,因为我的一些数字没有正确的结果。例如,当我传入 8388608 (0x800000) 时,输出是 8388608,而它应该是 16777216 (0x1000000)。

这是我们要复制其功能的代码:

unsigned test_dl23(unsigned uf) {
float f = u2f(uf);
float tf = 2*f;
if (isnan(f))
return uf;
else
return f2u(tf);
}

这是我的尝试:

unsigned dl23(unsigned uf) {

int pullExpMask, expMask, mantMask, i, mask, signedBit
mask = 0x007fffff;

pullExpMask = (-1 << 23) ^ 0x80000000; // fills lower 23 bits with zeroes
signedBit = 0x80000000 & uf;
expMask = (uf & pullExpMask); // grabs the exponent and signed bits, mantissa bits are zeroes
mantMask = mask & uf;

if (!(uf & mask)){ // if uf has an exponent that is all ones, return uf
return uf;
}

else if (expMask == 0){
mantMask = mantMask << 1;

}
else if (expMask != 0){
expMask = expMask + 0x00100000;
}

return (signedBit | expMask | mantMask);


}

我已经研究这个问题很长时间了,任何有用的提示将不胜感激!

最佳答案

我不确定您所说的失败数字是多少,但我确实在您的代码中发现了会导致此行为的错误。带有注释 //if uf has an exponent that is all Ones, return uf 的部分不会执行此描述的操作。它将测试尾数部分是否为 0 并返回未更改的数字,从而导致您所看到的行为。它可能应该类似于 if (expMask == pullExpMask) {

此外,您还需要考虑指数增量使其全部为 1 的情况。它应该始终变为 inf,而不是安静或信号 NaN。

关于c - float 的按位乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407381/

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