【问题标题】:Why pow function is giving error while dealing with long long int?为什么 pow 函数在处理 long long int 时会出错?
【发布时间】:2021-05-06 06:18:57
【问题描述】:
 #include<bits/stdc++.h>
using namespace std;
#define ll long long int
bool check(ll num)
{
    ll temp=num;
    ll sum=0;
    while(num!=0)
    {
        ll rem=num%10;
        sum+=pow(rem,3);
        num/=10;
    }
    if(sum==temp)
        return true;
    else
        return false;
}
int main()
{
    ll num;
   cin>>num;
    if(check(num))
        cout<<"It is a Armstrong number"<<endl;
    else
        cout<<"Not a Armstrong number"<<endl;
    return 0;
}

当第二次迭代中 num 等于 153 时,rem 的值为 5,但是当我将其放入 pow 函数时,它给了我 124 但 5 pow 3 等于 125 谁能告诉我是什么问题

【问题讨论】:

  • 无关:return sum == temp; 将比check 函数末尾的四行版本更具可读性。
  • 我不明白,你程序中唯一的pow() 函数正在执行pow(rem,5),所以第二次迭代的值应该是pow(5,5),即3125。整个过程你到底在哪里做pow(5,3)
  • @Arsenic srry 是战俘 (rem,3)
  • @paddy 是的,我没看到,谢谢你的帮助

标签: c++ data-structures integer long-integer pow


【解决方案1】:

因为您没有使用标准包含标头,所以我不能保证您使用的是来自&lt;cmath&gt;std::pow 的重载之一,其中一些采用整数类型作为指数。 (您可以使用没有重载的 C 风格 pow)。

您对using namespace std; 的使用进一步使事情变得混乱。尽管为了清晰起见在教程中使用它,但它从未用于高质量的生产代码。

在我看来,std::pow 的任何实现如果不能使用整数参数恢复最佳浮点值,都应该被认为是有缺陷的。也就是说,我所知道的任何标准(甚至 IEEE754)都没有提供任何此类保证。 (参见std::sqrt。)您会发现您的实现评估pow(x, y)exp(y * log(x)),这可能导致结果低于xy 看似微不足道的值的真实值。

对于像 3 这样的小指数,最好用手写的方式写出来:

sum += rem * rem * rem;

如果你确实被一个有缺陷的std::pow 实现的平台所诅咒,那么你总是可以为整数参数滚动你自己的。 平方求幂是经常使用的技术。

【讨论】:

    【解决方案2】:

    pow 函数作用于浮点类型,而不是整数,它返回一个浮点类型。您会看到整数截断与浮点错误相结合的结果。考虑通过基于整数的方法计算整数幂,或者如果您必须使用std::pow,则使用std::round 对结果进行四舍五入。

    例如:

    sum += static_cast<ll>(std::round(std::pow(rem, 5)));
    

    或者像以下这样幼稚的东西:

    sum += rem * rem * rem * rem * rem;
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 2013-10-05
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多