gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:04:20 24 4
gpt4 key购买 nike

我最近试图用c语言编写一个小程序来查找第n个斐类纳奇数。由于某种原因,当我运行它时,它会计算 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);
}

最佳答案

你的代码是一种违反标准、不可移植的黑客行为,在 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

关于c - 程序输出 2^n 而不是预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41628428/

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