【发布时间】:2016-02-03 04:05:23
【问题描述】:
目标:
4x ( 4.400000095 ) = 17.60000038
- 合法操作:任何整数/无符号操作,包括。 ||,&&。如果,同时
- 最大操作数:30
- 返回表达式 x + x + x + x for 的位级等效项
- 浮点参数 f.
我的代码:
unsigned 4x(unsigned uf) {
unsigned expn = (uf >> 23) & 0xFF;
unsigned sign = uf & 0x80000000;
unsigned frac = uf & 0x007FFFFF;
if (expn == 255 || (expn == 0 && frac == 0))
return uf;
if (expn) {
expn << 2;
} else if (frac == 0x7FFFFF) {
frac >> 2;
expn << 2;
} else {
frac <<= 2;
}
return (sign) | (expn << 23) | (frac);
}
您可以猜到,我的代码不起作用。不是将输入翻两番,而是将输入翻了一番。我不知道为什么,因为分数和指数总是右移/左移 2 而不是 1。我在 32 位机器中使用单精度浮点值。
【问题讨论】:
-
除了亚法线和接近无穷大,代码只需要将指数增加2。
-
您不能以这种方式操作浮点数。另外,
4x不是合法的函数名。 -
双方都赞赏
-
您有 2 个基本选项。第一个是包含
unsigned和float值的联合,这将允许您通过对unsigned表示进行操作来避免违反严格别名 的精神。下一个是通过声明一个指向浮点地址的指向无符号的指针的技术违规。如果你被允许使用工会,那就是要走的路。 -
你的标题说你想要
4 * x;你的例子说你想要 4.4 * 4 = 17.6,给或取一些分数;你的评论表明你想要x * x * x * x(又名x ** 4其中**是从Fortran借来的伪幂运算符)。你的意思是x + x + x + x?请清楚你想要什么——相互矛盾的信息很难给出一个好的答案。
标签: c floating-point precision unsigned