【问题标题】:Fibonacci function doesn't calculate properly斐波那契函数计算不正确
【发布时间】:2016-08-26 03:52:06
【问题描述】:

我已经定义了这个宏

#define FIB(n) (( 4 << n*(3+n))/((4 << (2*n)) - (2 << n) - 1))%(2 << n)

当我试图得到答案时,它不能正常工作,例如,如果我调用 FIB(7),它给我 0,这显然是错误的。我在 python 中测试了这个函数,它工作得很好。那么,谁能解释一下为什么它不能在 C 和 C++ 中工作?

【问题讨论】:

  • 你的宏甚至不带参数,所以FIB(7) 甚至没有意义,而且FIB 本身只有在存在名为n 的变量的范围内才能工作。
  • @BenjaminLindley 已修复,我在这里写的时候拼错了,
  • 为什么不使用constexpr 递归函数呢?
  • 还要注意,这不是 C++ 意义上的函数,只是数学意义上的函数。宏不是函数。
  • 宏函数是一个很好的方法,直到永远尝试调试。

标签: c++ macros fibonacci bit-shift


【解决方案1】:

当将n 替换为7 时,4 &lt;&lt; n*(3+n) 变为4 &lt;&lt; 7*(3+7)

表示4 &lt;&lt; 70。如果int 的大小是 32 位或 64 位,则移位 70 位太多,这会调用 C 中的未定义行为

Python 支持多精度算术,所以它可能运行良好。

【讨论】:

  • 另外,我尝试将其定义为具有 unsigned long long 的函数,同样的故事。但你是对的。
  • unsigned long long 是 64 位,70 位还是太多了。
  • 您可以为此使用多精度库,如 GMP(GNU 多精度库)。正如其他人已经告诉您的那样,标准 C++ 数据类型是有限的。
  • 什么?!我认为当移位超过位数时,移位保证产生 0
  • 问题标记为 C++,而不是 C
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2016-12-11
  • 2020-04-02
  • 2017-07-22
相关资源
最近更新 更多