Pourquoi est-Mathématiques.pow(0, 0) === 1?
Nous savons tous que 00 est indéterminée.
Mais, javascript dit que:
Math.pow(0, 0) === 1 //true
et C++ dit la même chose:
pow(0, 0) == 1 //true
POURQUOI?
Je sais que:
>Math.pow(0.001, 0.001)
0.9931160484209338
Mais pourquoi ne Math.pow(0, 0)
jeter pas d'erreurs? Ou peut-être un NaN
serait mieux que 1
.
- En vertu de la définition standard, "a<sup>b</sup> = exp(b ln(a))", c'est pas défini. En essayant de la définir comme "limite<sub>x>0</sub> f(x)<sup>g(x)</sup>", où "f" et "g" les deux ont des limites de zéro donne une valeur indéterminée, car il dépend de votre choix de fonctions. (Mes excuses pour la déformation de la notation; je ne peux pas comprendre comment obtenir des exposants dans les commentaires).
- oui, je suis consciente que 0⁰ (utiliser des caractères unicode) n'est pas défini compte tenu de cette définition, cependant, si vous lisez mon commentaire vous devriez noter que la citation des références au "monde des mathématiques" plutôt qu'une "définition standard". C'est cette différence que j'ai été à l'origine de renvoi, et la question a été mis à jour pour corriger cette nuance.
- Euh...a^0 = 1 pour les non-zéro.
- Il permet des fonctions qui dépendent des produits de probabilités de livrer des résultats sensées. C'est une mauvaise idée que les ordinateurs sont symboliques de mathématiques de processeurs. Le langage C a une mise en œuvre spécifique dans le monde réel, tandis que votre monde mathématique est peut-être trop idéal pour être inplemented dans le silicium.
- Pour les mathématiques, la version de cette question — “pourquoi avons-nous souvent de définir 0^0 = 1?” — math.stackexchange a beaucoup de bonnes réponses: math.stackexchange.com/questions/11150/...
- À mon humble avis, 0^0 doit être NaN, juste 0/0 est pour la virgule flottante, parce que la limite n'est pas définie de manière unique. En revanche, 1/0 EST bien défini comme l'Infini. Toute personne qui fait valoir que 0^0 devrait être de 1 car x^0=1 pour les non-zero x est seulement à la recherche à la moitié de celui - ci- ne pas oublier que 0^y=0 pour y>0. Je pense que la vraie réponse à cette question est "parce que CS majors ne sont plus les majors de mathématiques, comme ils étaient dans les années 1940."
Vous devez vous connecter pour publier un commentaire.
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ùN^0
doit toujours être1
mais0^N
doit toujours être0
pourN > 0
, de sorte que vous devriez ne pas avoir d'attentes mathématiquement à la suite de ce soit. Cette Wolfram Alpha les messages du forum, va dans un peu plus de détails.Bien qu'ayant
pow(0,0)
résultat dans1
est utile pour de nombreuses applications comme la Justification de la Norme Internationale—Langages de Programmation—C états dans la section traitant IEC 60559 l'arithmétique à virgule flottante support:mise à Jour du C++
Comme leemes souligné à juste titre j'ai d'abord lié à la référence de la complexe version de pow tandis que le non complexes version prétend que c'est erreur de domaine la projet de norme C++ revient à la projet de norme C et les deux C99 et C11 dans la section
7.12.7.4
Le pow fonctions paragraphe 2 dit (accent mine):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:Donc si il y avait un erreur de domaine alors ce serait de mise en œuvre de comportement défini mais dans les deux dernières versions de
gcc
etclang
la valeur deerrno
est0
il n'est donc pas erreur de domaine pour ces compilateurs.mise à Jour de Javascript
Pour Javascript la ECMAScript® Spécification Du Langage dans la section
15.8
L'Objet Math sous15.8.2.13
pow (x, y) dit entre autres conditions:En JavaScript
Math.pow
est définie comme suit:l'accent mine
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.
__STDC_IEC_559__
d'annoncer qu'il est conforme à cette spécification. Annexe F décrit IEC 60559 l'arithmétique à virgule flottante. Je crois que C spécification est admis partiellement conforme à l'Annexe F (par exemple, pow(0, 0) == 1) et de ne pas définir__STDC_IEC_559__
.C'est juste de la convention pour la définir comme
1
,0
, ou le laisserundefined
. La définition est très répandue en raison de la définition suivante:ECMA-Script de la documentation dit la chose suivante
pow(x,y)
:[ http://www.ecma-international.org/ecma-262/5.1/#sec-15.8.2.13 ]
Selon Wikipedia:
Il y a plusieurs façons possibles de traiter
0**0
avec les avantages et les inconvénients de chacun (voir Wikipédia pour une discussion prolongée).La IEEE 754-2008 virgule flottante norme recommande trois fonctions différentes:
pow
traite0**0
comme1
. C'est la plus ancienne version définis. Si la puissance est un entier, le résultat est le même que pourpown
, sinon le résultat est que pourpowr
(sauf pour certains cas exceptionnels).pown
traite 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
traite 0**0 comme valeur NaN (not-a-Number – non défini). La valeur est aussi NaN pour les cas commepowr(−3,2)
où la base est inférieure à zéro. La valeur est définie par exp(puissance'×log(base)).Donald Knuth
sorte de réglé ce débat, en 1992, avec le texte suivant:
Et est allé encore plus dans les détails dans son livre Deux Remarques sur la Notation.
Fondamentalement, alors que nous n'avons pas 1 comme la limite de
f(x)/g(x)
pour tous les pas de toutes les fonctionsf(x)
etg(x)
, il rend encore combinatoire tellement plus simple de définir0^0=1
, et puis il suffit de faire des cas particuliers dans les quelques endroits où vous avez besoin à considérer que les fonctions telles que0^x
, qui sont bizarre de toute façon. Après toutx^0
revient beaucoup plus souvent.Certains des meilleurs discussions je sais que ce sujet (autres que les Knuth papier) sont:
Lorsque vous voulez savoir quelle est la valeur que vous devriez donner à
f(a)
quandf
n'est pas directement calculable ena
, vous calculez la limite def
quandx
tend versa
.En cas de
x^y
, d'habitude limites tendent vers1
quandx
ety
ont tendance à0
, et surtoutx^x
tend vers1
quandx
tend à0
.Voir http://www.math.hmc.edu/funfacts/ffiles/10005.3-5.shtml
Le langage C définition dit (7.12.7.4/2):
Il dit aussi (7.12.1/2):
Par défaut, la valeur de
math_errhandling
estMATH_ERRNO
, afin de vérifiererrno
pour la valeurEDOM
.g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.
Je tiens à être en désaccord avec certains de la réponse à la question précédente assertion que c'est une question de convention ou de commodité (couvrant certains cas particuliers, pour les divers théorèmes, etc) que 0^0 être définie comme 1 au lieu de 0.
Exponentiation ne fit que bien avec nos autres notations mathématiques, de sorte que la définition que nous avons tous à apprendre les feuilles de place pour la confusion. D'une manière légèrement différente de l'approche c'est-à-dire que a^b (ou exp(a, b), si vous le souhaitez) renvoie la valeur multiplicatively équivalent à la multiplication des quelque chose d'autre par, répété b fois.
Lorsque l'on multiplie 5 par 4, 2 fois, nous obtenons 80. Nous avons multiplié 5 par 16. Donc, 4^2 = 16.
Quand vous multipliez 14 par 0, 0 fois, nous nous retrouvons avec 14. Nous avons multiplié il 1. Par conséquent, 0^0 = 1.
Cette ligne de pensée pourrait également aider à clarifier négatif et exposant fractionnaire. 4^(-2) est un du 16e, parce que "négatif multiplication" est la division de nous diviser par quatre à deux reprises.
a^(1/2) est la racine(a), car en multipliant quelque chose par la racine de a est la moitié de la multiplicatif de travail comme le multipliant par lui-même - que vous auriez à le faire deux fois de multiplier par quelque chose 4 = 4^1 = (4^(1/2))^2
Pour cela de comprendre vous avez besoin résoudre calcul:
Expansion
x^x
autour de zéro en utilisant les séries de Taylor, on obtient:Afin de comprendre ce qui se passe à la limite quand
x
à zéro,nous avons besoin de savoir ce qu'il se passe avec le deuxième terme
x log(x)
, parce que d'autres conditions sont proportionnelles àx log(x)
élevé à une certaine puissance.Nous avons besoin d'utiliser la transformation:
Maintenant, après cette transformation, nous pouvons utiliser L'Hôpital de la règle, qui stipule que:
Afin de différencier cette transformation, nous obtenons:
Nous avons donc calculé que la durée
log(x)*x
approches 0 lorsque x tend vers 0.Il est facile de voir que d'autres termes consécutifs également l'approche de zéro et même plus vite que le deuxième terme.
Donc à point
x=0
, la série devient1 + 0 + 0 + 0 + ...
et donc est égal à 1.