gpt4 book ai didi

c++ - C++中数字的n次根的精度错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:15 24 4
gpt4 key购买 nike

我从之前关于该主题的讨论帖了解到,使用浮点运算会导致精度异常。但有趣的是,我观察到同一个函数以两种不同的方式运行。
使用 COUT 输出是 4 但如果我将结果保存到变量中,则结果是 3!

#include <iostream>
#include <cmath>
using namespace std;
#define mod 1000000007
long long int fastPower(long long int a, int n){
long long int res = 1;
while (n) {
if (n & 1) res = (res * a) % mod;
n >>= 1; a = (a * a) % mod;
}
return res;
}
int main() {
int j = 3;
cout << pow(64, (double)1.0/(double)j) << endl; // Outputs 4
int root = pow(64, (double)1.0/(double)j);
cout << root << endl; // Outputs 3
/* As said by "pts", i tried including this condition in my code but including this line in my code resulted in TimeLimitExceeded(TLE). */
if (fastPower(root+1,j) <= 64) root++;
cout << root << endl; // Outputs 4 :)
return 0;
}

Code output on Ideone.com
现在,我们如何才能在编程比赛中避免这样的错误。我不想使用“round”函数,因为我只需要根的整数值。即
63(1/6) = 1, 20(1/2) = 4, 等等...
我应该如何修改我的代码,以便将正确的结果存储在根变量中。

最佳答案

pow 返回双倍。当使用 cout 时,它是四舍五入的(因此,它是 4)。当您将其转换为 int 时,它只会截断小数部分。 Pow 返回类似 4 - eps 的值(由于精度问题)。当它刚被截断时,它等于 3。在编程竞赛中有用的肮脏技巧:int root = (int)(pow(...) + 1e-7)

关于c++ - C++中数字的n次根的精度错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24110028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com