为什么 pow 函数在处理 long long int 时出错?

问题描述

 #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 谁能告诉我这是什么问题

解决方法

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

例如:

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

或者像这样幼稚的东西:

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

因为您没有使用标准的包含标头,所以我不能保证您使用的是 std::pow 中的 <cmath> 重载之一,其中一些采用整数类型作为指数。 (您可以使用没有重载的 C 样式 pow)。

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

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

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

sum += rem * rem * rem;

如果您确实被一个有缺陷的 std::pow 实现的平台所诅咒,那么您总是可以针对整数参数推出自己的平台。 平方取幂是经常使用的技术。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...