我最近试图在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);
}
答案 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