【问题标题】:why can't I verify a `pow` function in a `while` loop?为什么我不能在 `while` 循环中验证 `pow` 函数?
【发布时间】:2020-08-22 02:14:15
【问题描述】:

我已经尝试了一个小时来解决这个问题,这非常令人沮丧,我无法理解为什么下一个循环无法验证自己

while(p>1) {
    p--;
    if (pow(n, contor) == p) {
        contor2++;
    }
}

完整的代码

#include <iostream>
#include <cmath>

int main()
{
    int n, p, resetP;
    float contor = 0;
    float contor2 = 0;
    n = 3;
    p = 100;
    resetP = p;
    while (p > 1)
    {
        contor++;
        p = p / n;
    }
    p = resetP;
    while (p > 1)
    {
        p--;
        if (pow(n, contor) == p)
            contor2++;
    }

    std::cout << contor2;
}

我在这里尝试做的是验证if(pow(3, 4)==81,但它似乎不起作用。 p 我将它从 100 设置为从 1 到 0。当它达到 81 时,它只是越过它,就像它只是不验证 if 而我的 contor2 保持完全相同(即为 0)。我已经学习 C++ 6 个多月了,但这是我第一次真正陷入困境。

【问题讨论】:

  • 你所说的“验证自己的循环”是什么意思?
  • 为什么你期望pow( 3, 4.0f ) 正好等于81? p == 80contor2 增加了吗?
  • 提供的代码无法编译,您能否尝试包含minimal reproducible example?
  • pow 函数返回一个浮点值。您将结果分配给一个整数。这里会有一些截断。
  • “我希望 pow(3, 4)==81 因为 3x3x3x3=81”了解浮点运算以及为什么使用相等运算符比较浮点不是一个好主意

标签: c++ loops for-loop while-loop pow


【解决方案1】:

我用 msvsc 19 和 g++ 运行了几次你的代码,都用 x86 和 x64,它作为例外工作并打印 1 当p 达到 81 并且 counter2 加 1 时进入 if 语句 这是我尝试过的代码

#include <iostream>
#include <cmath>
int main() {
    int n, p, saveP = 0, resetP;
    float contor = 0;
    float contor2 = 0;
    n = 3;
    p = 100;
    resetP = p;
    while (p > 1) {
        contor++;
        p = p / n;
    }
    p = resetP;
    while (p > 1) {
        p--;
        if (pow(n, contor) == p)
            contor2++;
    }
    std::cout << contor2;
}

检查你的编译器设置(也许你没有编译你正在编辑的 cpp 文件) 并检查语法错误(如 if 语句中的范围)

我不知道您的整个代码是什么,但在这里将 countercounter2 声明为 int 和 p 声明为 float

【讨论】:

  • 谢谢,但我现在已经试过了,对我来说仍然是 0。这很奇怪。
  • @jaketherazvy 我也在多个在线 cpp 编译器上运行(例如 onlinegdb.com/rklX9NagqU),它可以工作。复制粘贴我的确切代码,并检查您是否正在编辑正确的 cpp 文件.. 如果不起作用,请尝试创建新项目并尝试。这一定是编译器的问题,也可以在调试模式下尝试或禁用优化
  • @jaketherazvy 如果仍然无法正常工作,请发布反汇编,这可能是您的编译器的优化错误
  • 在调试模式下为 0,在发布模式下为 99
  • @jaketherazvy 如果结果在 debug vs release mode 上发生变化,并且在 debug 和 99in release 中始终为 0,那么这是您的编译器的错误。你用的是什么编译器?你能生成反汇编并在你的问题中发布吗,如果我们可以验证它是编译器中的一个错误,那么你应该做的是使用另一个并将其报告给制造
猜你喜欢
  • 2019-05-10
  • 2015-03-01
  • 2012-08-23
  • 1970-01-01
  • 2012-11-07
  • 2022-10-16
  • 2019-03-11
  • 2022-01-06
  • 2018-05-23
相关资源
最近更新 更多