【问题标题】:factorial function with custom numbers doesn't work具有自定义数字的阶乘函数不起作用
【发布时间】:2017-04-18 10:04:06
【问题描述】:

最近我一直在开发一个库来处理具有数千位数字的非常大的数字。 我现在已经为这些事情处理了一个阶乘函数,因为我刚刚设置了乘法。

largeNum factorial(largeNum& input) {
    if (input > one) return (input * factorial(--input));
    else return one;
}

"one" 是一个 largeNum,它的值定义为 "one" 并带有 "+" 号,因为我还没有实现整数转换。

Factorial 是 largeNum 类的友元函数。我没有收到任何语法错误,它必须是合乎逻辑的。

前缀 -- 运算符已正确重载并经过测试。

乘法和“>”运算符也是如此。

  • 输入 5 返回 24,即 4!
  • 输入 6 返回 120,即 5!。 等等。

也许我只是因为睡眠不足而完全失明,但我需要一些帮助。 干杯。

【问题讨论】:

  • 您正在对评估顺序做出假设,这会导致未定义的行为。我建议将--input 更改为input - 1
  • factorial 应该将参数作为 const 引用而不是没有 const 引用。
  • “减号运算符很容易实现......”我想你说的是一元-,这在这里并不重要
  • 你的二进制 - 是什么样子的?
  • 为什么阶乘函数需要访问数字类的内部?换句话说:为什么它是朋友?

标签: c++ class math friend factorial


【解决方案1】:

回答您的问题:“意外”结果,即“输入 5 给出 4!,而不是 5!”,与以下代码行引入的未定义行为有关:

input * factorial(--input)

请注意,C++ 中运算符的求值顺序大多是未定义的(例如,参见cppreference)。因此,factorial(--input) 可能会在其结果乘以 input 的(同时更改?)值之前进行评估。结合副作用,其中操作更改相同(或其他)对象,当相同(或其他)对象用于同一表达式时,通常会导致未定义的行为,而两者之间没有序列点。正如操作n = ++i + i; 是UB(参见evaluation order / undefined behaviour)。

因此,此代码有时可能会按照您的预期运行,但也可能会完全不同。

所以如果--inputinput 的内容有副作用(我们可以假设),那么您的代码必须重写为

input * factorial(input-one)

其中(input - one) 不得以任何方式更改input(当然,必须实现它以提供正确的结果)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2021-01-17
    相关资源
    最近更新 更多