程序输出2 ^ n而不是预期

时间:2017-01-13 06:14:05

标签: c

我最近试图在c中制作一个小程序来找到第n个fibannaci数。出于某种原因,当我运行它而不是计算2 ^ n并返回时,我已经问了一下但似乎没有人能够确定原因。我希望有人能帮助我搞清楚。

float wat(int n){
  int a = 0x3fcf1bbd, b = 0x3f1e377a, c = 0x807fffff, d = 0x400f1bbd;
  int e = (((a >> 23) + n) << 23) | (a & c);
  int f = (((b >> 23) + n) << 23) | (b & c);
  return ((*(float*)&e) + (*(float*)&f))/(*(float*)&d);
}

1 个答案:

答案 0 :(得分:3)

你的代码是一个标准违反,不可移植的黑客攻击,可能在20年前非常特殊的情况下有意义,并且当浮点硬件的速度比cpu的其他部分慢。今天它完全没有意义,今天要求某人为你调试它就像寻求帮助,用石棉隔绝你的房子。我们不再这样做了,原因很充分。

它们都可以用正确的便携式浮点运算编写,如下所示:

#include <math.h>
float
wat(int n)
{
        float a = 0x1.9e377ap+0;
        float b = -0x1.3c6ef4p-1;
        float d = 0x1.1e377ap+1;
        return (ldexpf(a, n) - ldexpf(b, n)) / d;
}

这完全是一回事,但没有恶心的黑客。当然,它不会做任何有用的事情,因为将n添加到X的指数不会X^n,它会X*2^n。所以你的计算结果是:

s = sqrt(5)
(2^n * (1 + s)/2 - 2^n * (1 - s)/2)/s = 
(2^n/2 * ((1 + s) - (1 - s)))/s = 
2^n