Question

Je suis un problème avec C #. Pour être précis avec le Math.pow (). Si je tente de calculer 15 ^ 14 alors je reçois « 29192926025390624 ». Mais si je calcule avec Wolfram Alpha je reçois « 29192926025390625 ». Comme vous pouvez le voir seule différence est 1 nombre. Wolfram Alpha est correct cependant. Pourquoi pas C #? et comment puis-je résoudre ce problème pour que je puisse obtenir la valeur correcte en C #? 7

Mon code est assez simple puisque je suis juste essayer avec des exemples codés en dur. Donc ce que je fais est: Math.Pow(15,14); Cela donne 29192926025390624. Et non « 29192926025390625 » qui est la bonne réponse.

Liens: Wolfram Alpha

Était-ce utile?

La solution

Math.Pow fonctionne sur les types à virgule flottante, qui sont par définition inexactes. Si vous avez besoin des entiers de précision arbitraire, utilisez un type entier de précision arbitraire comme le la structure BigInteger. BigInteger a aussi une méthode Pow .

Autres conseils

Math.pow fonctionne sur des doubles. Cette mise en œuvre avec une longue obtient la bonne réponse:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));

Math.pow fonctionne sur des doubles. Doubles sont 64 bits à virgule flottante et avoir environ 15-16 chiffres de précision en C # , et donc ce que vous voyez est une erreur d'arrondi. C'est ainsi que les nombres à virgule flottante travail.

Si vous avez besoin d'une plus grande précision, essayez d'utiliser décimal . Il est de 128 bits et utilise 10 comme base. Cela vous donne une représentation précise des nombres jusqu'à 28-29 chiffres significatifs. Vous pouvez facilement définir votre propre méthode pour Pow décimal.

Si decimal ne suffit pas, se tourner vers BigInteger , qui a été ajouté dans .NET 4.

Math.pow () fonctionne correctement son problème avec double type de données    voir.

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

Oops Désolé, la valeur de vérification par point d'arrêt; dans votre programme;

Math.pow de C # 'renvoie un double, un nombre à virgule flottante standard IEEE 754. Il a seulement 15 chiffres significatifs:

http://msdn.microsoft.com/en- nous / bibliothèque / system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top