90 votes

Pourquoi Math.pow (0, 0) === 1?

Nous savons tous que 0 0 est indéterminé.

Mais , javascript dit que:

 Math.pow(0, 0) === 1 // true
 

et C ++ dit la même chose:

 pow(0, 0) == 1 // true
 

POURQUOI?

Je le sais:

 >Math.pow(0.001, 0.001)
0.9931160484209338
 

Mais pourquoi Math.pow(0, 0) ne génère aucune erreur? Ou peut-être qu'un NaN serait mieux que 1 .

79voto

Shafik Yaghmour Points 42198

En C++, Le résultat de pow(0, 0) le résultat est essentiellement définie par l'implémentation de comportement car mathématiquement, nous avons une situation contradictoire où l' N^0 doit toujours être 1 mais 0^N doit toujours être 0 pour N > 0, de sorte que vous devriez ne pas avoir d'attentes mathématiquement à la suite de ce soit. Cette Wolfram Alpha messages du forum, va dans un peu plus de détails.

Bien qu'ayant pow(0,0) résultat en 1 est utile pour de nombreuses applications comme la Justification de la Norme Internationale-Langages de Programmation-C - unis dans la section traitant de l'IEC 60559 l'arithmétique à virgule flottante de soutien:

Généralement, C99 évite NaN résultat où une valeur numérique est utile. [...] Les résultats de pow(∞,0) et pow(0,0) sont tous deux à 1, car il y a des applications qui peuvent exploiter cette définition. Par exemple, si x(p) et y(p) sont des fonctions analytiques qui deviennent de zéro à p = a, alors pow(x,y), qui est égal à exp(a*log(x)), les approches 1 que p s'approche d'un.

Mise À Jour De C++

Comme leemes souligné à juste titre j'ai d'abord lié à la référence pour le complexe de la version de pow tandis que le non-complexe de la version prétend que c'est du domaine de l'erreur de l' ébauche de la norme C++ retombe sur le projet de norme C et les deux C99 et C11 dans la section 7.12.7.4 Le pow fonctions de l'alinéa 2 dit: (c'est moi qui souligne):

[...]Une erreur de domaine peut se produire si x est égal à zéro et y est égal à zéro.[...]

qui, autant que je peux dire que signifie ce comportement est un comportement non spécifié enroulant un peu la section 7.12.1 Traitement de conditions d'erreur dit:

[...]une erreur de domaine se produit si un argument d'entrée est en dehors du domaine de plus de dont la fonction mathématique est définie.[...] Sur un domaine d'erreur, la fonction renvoie une mise en valeur définie; si l'expression entière math_errhandling & MATH_ERRNO est différente de zéro, l'expression entière errno acquiert la valeur d'EDOM; [...]

Donc si il y avait une erreur de domaine alors ce serait mise en œuvre, les comportements définis , mais dans les deux dernières versions de l' gcc et clang la valeur de errno est 0 il n'est donc pas une erreur de domaine de ces compilateurs.

Mise À Jour De Javascript

Pour le Javascript le ECMAScript® Spécification du Langage dans la section 15.8 L'Objet Math en vertu de l' 15.8.2.13 pow (x, y) est dit entre autres conditions que:

Si y est de +0, le résultat est 1, même si x est NaN.

35voto

zzzzBov Points 62084

En JavaScript Math.pow est définie comme suit:

  • Si y est NaN, le résultat est NaN.
  • Si y est de +0, le résultat est 1, même si x est NaN.
  • Si y est à 0, le résultat est 1, même si x est NaN.
  • Si x est de NaN et de y est différent de zéro, le résultat est NaN.
  • Si abs(x)>1 et y est +∞, le résultat est +∞.
  • Si abs(x)>1 et y est −∞, le résultat est +0.
  • Si abs(x)==1 et y est +∞, le résultat est NaN.
  • Si abs(x)==1 et y est −∞, le résultat est NaN.
  • Si abs(x)<1 et y est +∞, le résultat est +0.
  • Si abs(x)<1 et y est −∞, le résultat est +∞.
  • Si x est +∞ et y>0, le résultat est +∞.
  • Si x est +∞ et y<0, le résultat est +0.
  • Si x est −∞ et y>0 et y est un entier impair, le résultat est −∞.
  • Si x est −∞ et y>0 et y n'est pas entier impair, le résultat est +∞.
  • Si x est −∞ et y<0 et y est un entier impair, le résultat est de 0.
  • Si x est −∞ et y<0 et y n'est pas entier impair, le résultat est +0.
  • Si x est de +0 et y>0, le résultat est +0.
  • Si x est de +0 et y<0, le résultat est +∞.
  • Si x est 0 et y>0 et y est un entier impair, le résultat est de 0.
  • Si x est 0 et y>0 et y n'est pas entier impair, le résultat est +0.
  • Si x est 0 et y<0 et y est un entier impair, le résultat est −∞.
  • Si x est 0 et y<0 et y n'est pas entier impair, le résultat est +∞.
  • Si x<0 et x est fini et y est fini et y n'est pas un entier, le résultat est NaN.

c'est moi qui souligne

en règle générale, les fonctions natives de n'importe quelle langue devrait fonctionner comme décrit dans la spécification du langage. Parfois, cela inclut explicitement "un comportement indéfini" où c'est à l'analyste de déterminer ce que le résultat doit être, mais ce n'est pas une affaire de comportement indéfini.

17voto

Josua Schmid Points 541

C'est juste de la convention pour la définir comme 1, 0 ou de la quitter undefined. La définition pow(0,0) est large en raison de la définition suivante:

mathematical power definition


ECMA-Script de la documentation dit la chose suivante pow(x,y):

  • Si y est de +0, le résultat est 1, même si x est NaN.
  • Si y est à 0, le résultat est 1, même si x est NaN.

[ http://www.ecma-international.org/ecma-262/5.1/#sec-15.8.2.13 ]

14voto

NPE Points 169956

Selon Wikipedia:

Dans la plupart des paramètres ne comportant pas de continuité de l'exposant, l'interprétation 00 1 simplifie les formules et élimine le besoin pour des cas particuliers de théorèmes.

Il y a plusieurs façons de traiter l' 0**0 avec les avantages et les inconvénients de chacun (voir Wikipédia pour une discussion prolongée).

La norme IEEE 754-2008 de virgule flottante norme recommande trois fonctions différentes:

  • pow friandises 0**0 comme 1. C'est la plus ancienne version définis. Si la puissance est un entier, le résultat est le même que pour l' pown, sinon le résultat est que pour l' powr (sauf pour certains cas exceptionnels).
  • pown friandises 0**0 que de 1. La puissance doit être un entier. La valeur est définie pour les bases; par exemple, pown(−3,5) est −243.
  • powr friandises 0**0 comme valeur NaN (not-a-Number – non défini). La valeur est aussi NaN pour les cas comme powr(−3,2) où la base est inférieure à zéro. La valeur est définie par exp(puissance'×log(base)).

5voto

dystroy Points 145126

Lorsque vous voulez savoir quelle est la valeur que vous devriez donner à l' f(a) lorsque f n'est pas directement calculable en a, vous calculez la limite de f lorsque x tend vers a.

Dans le cas d' x^y, limites habituelles tendent vers l' 1 lorsque x et y ont tendance à 0, et en particulier x^x tend vers 1 lorsque x tend 0.

Voir http://www.math.hmc.edu/funfacts/ffiles/10005.3-5.shtml

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X