【问题标题】:How do you use an exponent in c++ with a variable?如何在 C++ 中将指数与变量一起使用?
【发布时间】:2009-04-03 05:10:39
【问题描述】:

所以我意识到#include 是必要的,并且有一个 pow(x,y) x^y 工作...但是当我尝试使用 pow(2,(num-1)) 时,它踢了返回一个错误...

errorC2668: 'pow' : 对重载函数的模糊调用

我的代码行如下

perfect = (pow(2,(num-1))) * (pow(2,num)-1);

有什么建议吗?

提前致谢

编辑:

num 确实被声明为 int。

num 确实有一个值,从 1 开始到 UINT_MAX

在方程式中添加了一个星号

【问题讨论】:

  • 奇怪的是,这与 g++ 一样工作。也许这是一个扩展。
  • 我有一个朋友正在和我交谈,他使用 g++ 和 linux,对他也很好......是的,是的!我知道! Linux 更好,但我不能在 linux 上大量玩游戏,所以我被 windows 卡住了。

标签: c++ variables exponent


【解决方案1】:

编译器不知道要调用哪个 pow() 函数。 here 列出的重载给出了以下列表:

      float pow (       float base,       float exponent );
     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,         int exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

编译器不会猜测使用哪一个。使用强制转换使其明确。

perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1);

那里可能有一些额外的演员表,但它们不会伤害任何东西。

【讨论】:

  • 我不认为它是 num 因为这会导致它选择最后两个之一。我认为应该将 2 显式转换为最后两个中的一种数据类型。
  • 从 int 到 double 的转换不会有任何影响吗?
  • 是的,你可以在不投射 num 的情况下逃脱。
  • @Jeff:也许是效率。实现 2^5 可能比 2^5.0 更快。
  • 将其视为 x^int 与 x^double,而不是真正的 2(这是一个特殊数字)。有两个版本的事实似乎表明实现是不同的,因为在任何其他情况下,int 将自动提升为 double,只有 pow( X, double ) 版本。
【解决方案2】:

这些是 C++ 中允许的 pow() 函数。问题是您的代码有一个 int 作为第一个参数,而 C++ 不知道是将其提升为 double 还是 long double。

     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );

尝试输入(double)2 而不仅仅是2

perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1)

【讨论】:

    【解决方案3】:

    添加缺少的乘法(或您想要的),并且在行尾应该有分号:

    perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;
    

    【讨论】:

    • 完全忘记了需要的星号...但是在实际代码中有一个分号...虽然没有帮助
    【解决方案4】:

    来自error C2668: 'pow' : ambiguous call to overloaded function in VC++ 2005 only,alex.m 写道,

    “pow”(任何重载)采用浮动 点类型编号(单、双或 长双精度)作为第一个 参数,而不是整数。这是 错误来自哪里,因为 编译器猜不出你想要的方式 您要转换的长整数。

    试着写一个演员表, 像这样:

    代码块

    c = pow((double)numberOfScansCompleted, 2);

    所以,如果您尝试pow((double)2,(num-1)),它应该可以工作。


    有趣的旁注,当我在 Google 中输入它的开头时,“pow ambiguous call to overloaded function”出现在建议的搜索结果中。

    【讨论】:

      【解决方案5】:

      请记住,您还可以使用移位运算符编写 2 的整数幂:

      int perfect = (1<<(num-1)) * ((1<<num) - 1);
      

      或者ldexp(也包括&lt;cmath&gt;):

      double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);
      

      【讨论】:

        猜你喜欢
        • 2021-09-24
        • 2020-05-18
        • 2014-12-27
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多