gpt4 book ai didi

c++ - math.h pow() 函数无法正常工作?

转载 作者:行者123 更新时间:2023-11-30 02:00:15 26 4
gpt4 key购买 nike

我正在做一个个人项目,我需要在其中确定所有 prime powers在 0 到 999 之间。因为我不是特别擅长数学,所以我厌倦了以下火腿暴力的方法。

bool constexpr is_prime(int imp)
{
return imp == 1 ? false : (imp % imp == 0 && imp % 1 == 0 && [&imp]{ for(int i = 2; i < imp; ++i) if(imp % i == 0) return false; return true;}());
}

bool is_prime_power(int imp)
{
for(int i = 1; i < 1000; ++i)
if (is_prime(i))
for (int j = 0; j < 100; ++j)
if (imp == pow(i, j))
return true;
return false;
}

对于 0...30,输出应该是(根据 A000961 ):

1 2 3 4 5 7 8 9 11 13 16 17 19

然而,这是我得到的:

1 2 3 4 5 7 8 9 11 16 19

13 和 17 消失到哪里去了?

由于我在我的方法中找不到任何逻辑问题,所以我实现了自己的 pow() 函数。

double constexpr _pow(double base, double exp)
{
return exp == 0 ? 1 : base*pow(base, exp - 1);
}

现在,如果我从 math.h 中调用我的 _pow() 而不是 pow() 版本,输出将显示为异常。我的实现有误吗?否则,math.h 中的 pow() 将无法正常工作。知道是什么原因造成的吗?

最佳答案

问题是 double(和一般的 float )不精确,标准库中的数学函数也使用近似公式进行计算。例如,如果您调用 pow(2, 10),您可能会得到 1023.999375(然后,根据上下文,可能会被截断为 1023 )。

因此,您可以使用自己的精确整数实现,而不是使用标准库中的浮点pow() 函数:

int constexpr _pow(int base, int exp)
{
return exp == 0 ? 1 : base * _pow(base, exp - 1);
}

(如果您需要 unsignedlong long,也可以将其更改为您想要的任何整数类型)。

关于c++ - math.h pow() 函数无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348464/

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