Je travaillais sur un projet personnel dans lequel j'avais besoin de déterminer tous les prime powers entre 0 et 999. Parce que je ne suis pas particulièrement bon en maths, j'ai fatigué l'approche suivante de la force brutale.La fonction math.h pow() ne fonctionne pas correctement?
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;
}
Pour 0 ... 30 la sortie doit être (selon A000961):
1 2 3 4 5 7 8 9 11 13 16 17 19
Cependant, voici ce que je reçois à la place:
1 2 3 4 5 7 8 9 11 16 19
Où avez 13 et 17 disparaissent à?
Comme je n'ai pas trouvé de problèmes logiques avec mon approche, j'ai implémenté ma propre fonction pow().
double constexpr _pow(double base, double exp)
{
return exp == 0 ? 1 : base*pow(base, exp - 1);
}
Maintenant, si je l'appelle ma version de _pow() au lieu de pow() à partir math.h la sortie est affichée comme exceptée. Ma mise en œuvre est-elle incorrecte? Sinon, pow() de math.h ne peut pas fonctionner correctement. Une idée de ce qui cause cela?
* Jamais * comparer un double à un int. –
@Hans Passant C'est la première fois que j'ai entendu quelque chose comme ça. Quel est le problème? Le compilateur ne devrait-il pas m'avertir de ce genre de choses? – CaffeineAddict
@ cyberpunk_ http://floating-point-gui.de/ –