[C ++ pow()函数在放入函数时会改变行为

问题描述 投票:2回答:1

我已经用C ++编程了一段时间了。以前我曾见过幂函数由于精度问题而对较大的幂给出了错误的答案,但是今天在解决编码问题时,我看到在相同类型的参数下,将pow()函数放在函数中与直接评估时给出的值不同。

 #include<iostream>
 #include<math.h>
 using namespace std;
 #define ll long long
 ll n,d;

 ll power(ll x)
 {
    return pow(100,x);
 }

 ll powersecond(ll x)
 {
    return pow(100,(int)x);
 }
 int main()
 {
    n = 68; d = 2;
    cout<<n*power(d)<<endl;        // outputs 679932
    cout<<n*pow(100,d)<<endl;      // outputs 680000
    cout<<n*powersecond(d)<<endl;  // outputs 679932
    cout<<n*pow(100,(int)d)<<endl; // outputs 680000
    return 0;
 }

[注意,即使在powersecond()函数中将x转换为整数后,答案也不会改变。即使d是int而不是long long int,答案仍然是679932。我使用的编译器是VS Code中的gnu gcc编译器。

c++ math c++14 c++17 gnu
1个回答
-1
投票

没有问题,每个都解决了不同类型的std::pow的不同重载。

std::pow是使用浮点算法计算的,因此您可能会得到像这样的数值奇数。对于精确的整数版本,请使用快速整数方法(尽管整数数据类型的范围较小):

template <class T, class N>
T ipow(T x, N pow)
{
    auto value = T(1);

    while (pow != 0)
    {
        if ((pow & 1) == 1)
        {
            value *= x;
        }

        x *= x;

        pow >>= 1;
    }

    return value;
}

请注意,这仅适用于正整数,但是很容易在此之上构建适用于负整数的一个。

© www.soinside.com 2019 - 2024. All rights reserved.