88

0 0が不確定であることは誰もが知っています。

しかしjavascriptは次のように言っています:

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

そしてC ++は同じことを言います:

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

なぜ?

そんなこと知ってる:

>Math.pow(0.001, 0.001)
0.9931160484209338

しかし、なぜMath.pow(0, 0)エラーが発生しないのでしょうか? または多分 aNaNよりも良いでしょう1

4

9 に答える 9

79

In C++ pow(0, 0)の結果は基本的に実装定義の動作です。これは、数学的に常にあるべきであるが、常にあるべきであるという矛盾した状況があるためN^0です。このWolfram Alphaフォーラムの投稿では、もう少し詳しく説明しています。10^N0N > 0

IEC 60559 浮動小数点演算サポートをカバーするセクションで、国際標準 — プログラミング言語— C の根拠pow(0,0)として次のように、結果を持つこと1は多くのアプリケーションに役立ちます。

一般に、C99 は、数値が有用な NaN の結果を避けます。[...] pow(∞,0) と pow(0,0) の結果は両方とも 1 です。これは、この定義を利用できるアプリケーションがあるためです。たとえば、x(p) と y(p) が p = a でゼロになる分析関数である場合、p が近づくにつれて exp(y*log(x)) に等しい pow(x,y) は 1 に近づきます。を。

C++ を更新する

leemes が正しく指摘したように、私は最初にpowの複雑なバージョンのリファレンスにリンクしましたが、非複雑なバージョンはそれがドメイン エラーであると主張していますが、ドラフト C++ 標準はドラフトC標準にフォールバックし、セクションpow 関数の段落でC99C11の両方を使用します。 2は言います(私の強調):7.12.7.4

[...] x がゼロで y がゼロの場合、ドメイン エラーが発生することがあります。[...]

私が知る限り、この動作は未定義の動作であることを意味しますビットセクションを巻き戻す7.12.1 エラー状態の扱いは次のとおりです。

[...]入力引数が、数学関数が定義されているドメインの外にある場合、ドメイン エラーが発生します。[...] ドメイン エラーでは、関数は実装定義の値を返します。整数式 math_errhandling & MATH_ERRNO がゼロ以外の場合、整数式 errno は値 EDOM を取得します。[...]

したがって、ドメイン エラーがあった場合、これは実装定義の動作になりますが、 の最新バージョンgccclangの値の両方で、これらのコンパイラのドメイン エラーerrnoでは0ありません。

Javascript を更新する

Javascriptの場合、セクションThe Math Object under pow (x, y)のECMAScript® Language Specificationは、他の条件の中で次のように述べています。15.8 15.8.2.13

y が +0 の場合、x が NaN であっても結果は 1 になります。

于 2013-11-13T14:14:33.487 に答える
35

JavaScriptMath.powでは、次のように定義されています

  • y が NaN の場合、結果は NaN になります。
  • y が +0 の場合、x が NaN であっても結果は 1 になります。
  • y が −0 の場合、x が NaN であっても、結果は 1 になります。
  • x が NaN で y が非ゼロの場合、結果は NaN になります。
  • abs(x)>1 で y が +∞ の場合、結果は +∞ になります。
  • abs(x)>1 で y が −∞ の場合、結果は +0 です。
  • abs(x)==1 で y が +∞ の場合、結果は NaN になります。
  • abs(x)==1 で y が −∞ の場合、結果は NaN になります。
  • abs(x)<1 で y が +∞ の場合、結果は +0 です。
  • abs(x)<1 で y が −∞ の場合、結果は +∞ になります。
  • x が +∞ で y>0 の場合、結果は +∞ になります。
  • x が +∞ で y<0 の場合、結果は +0 になります。
  • x が −∞ で y>0 で、y が奇数の整数の場合、結果は −∞ になります。
  • x が −∞ で y>0 で、y が奇数でない場合、結果は +∞ になります。
  • x が −∞ かつ y<0 で、y が奇数の整数の場合、結果は −0 です。
  • x が −∞ かつ y<0 で、y が奇数でない場合、結果は +0 です。
  • x が +0 で y>0 の場合、結果は +0 になります。
  • x が +0 で y<0 の場合、結果は +∞ になります。
  • x が -0 かつ y>0 で、y が奇数の整数の場合、結果は -0 です。
  • x が −0 で y>0 で、y が奇数でない場合、結果は +0 になります。
  • x が −0 かつ y<0 で、y が奇数の整数の場合、結果は −∞ になります。
  • x が −0 かつ y<0 で、y が奇数でない場合、結果は +∞ になります。
  • x<0 で x が有限で y が有限で y が整数でない場合、結果は NaN になります。

強調鉱山

原則として、すべての言語のネイティブ関数は、言語仕様で説明されているとおりに機能する必要があります。これには、結果がどうあるべきかを実装者が決定する明示的な「未定義の動作」が含まれることがありますが、これは未定義の動作の場合ではありません。

于 2013-11-13T14:16:05.797 に答える
16

として定義するか10そのままにしておくのは単なる慣習undefinedです。この定義パウ(0,0)は、次の定義により広く普及しています。

数学的パワー定義


ECMA-Script のドキュメントには、 について次のように記載されていますpow(x,y)

  • y が +0 の場合、x が NaN であっても結果は 1 になります。
  • y が −0 の場合、x が NaN であっても、結果は 1 になります。

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

于 2013-11-13T14:29:13.560 に答える
7

ドナルド・クヌース

1992 年に、次のようにこの論争に決着をつけました。

ここに画像の説明を入力

そして、彼の論文Two Notes on Notationでさらに詳しく説明しました。

基本的に、f(x)/g(x)すべての関数f(x)との制限として 1 を持っているわけではありませんがg(x)、それでも組み合わせ論を定義するのが非常に簡単に0^0=1なり、 などの関数を考慮する必要があるいくつかの場所で特別なケースを作成するだけです0^x。とにかく変です。結局x^0、もっと頻繁に出てきます。

このトピックについて私が知っている最高の議論のいくつか (Knuth の論文以外) は次のとおりです。

于 2013-12-04T13:03:12.007 に答える
5

C 言語の定義では (7.12.7.4/2):

x がゼロで y がゼロの場合、定義域エラーが発生する可能性があります。

また、(7.12.1/2):

ドメイン エラーの場合、関数は実装定義の値を返します。整数式 math_errhandling & MATH_ERRNO がゼロ以外の場合、整数式 errno は値 EDOM を取得します。整数式 math_errhandling & MATH_ERREXCEPT がゼロ以外の場合、「無効な」浮動小数点例外が発生します。

デフォルトでは、 の値はmath_errhandlingであるため、値をMATH_ERRNO確認してください。errnoEDOM

于 2013-11-13T14:26:28.847 に答える
5

が で直接計算できないf(a)場合にどの値を与えるべきかを知りたい場合は、 に向かう傾向がある場合の極限を計算します。fafxa

の場合x^y、通常の制限はとの傾向があり、特に の1場合に傾向があります。xy0x^x1x0

http://www.math.hmc.edu/funfacts/ffiles/10005.3-5.shtmlを参照してください。

于 2013-11-13T14:17:45.990 に答える
0

0^0 を 0 ではなく 1 として定義するのは、慣例または利便性 (さまざまな定理の特殊なケースをカバーするなど) の問題であるという以前の回答の主張のいくつかに反対したいと思います。

累乗は、実際には他の数学表記法とうまく適合しないため、私たちが学ぶ定義には混乱の余地があります。アプローチの少し異なる方法は、a^b (または、必要に応じて exp(a, b)) が、他の何かを a で乗算し、b 回繰り返されるのと同じ値を乗算的に返すと言うことです。

5 を 4 で 2 回掛けると、80 になります。5 を 16 で掛けたので、4^2 = 16 です。

14 に 0 を 0 回掛けると、14 が残ります。これに 1 を掛けました。したがって、0^0 = 1 です。

この考え方は、負の指数と分数指数を明確にするのにも役立つかもしれません。「負の乗算」は除算であるため、4^(-2) は 16 番目です。4 で 2 回割ります。

a^(1/2) は root(a) です。なぜなら、何かに a の根を掛けることは、それ自体を掛ける場合の乗法作業の半分であるためです。何かを 4 = 4^1 = 掛けるには、それを 2 回行う必要があります。 (4^(1/2))^2

于 2013-12-06T18:31:12.700 に答える
0

これを理解するには、微積分を解く必要があります。

ここに画像の説明を入力

x^xテイラー級数を使用してゼロ付近を展開すると、次のようになります。

ここに画像の説明を入力

したがって、 limitxがゼロになったときに何が起こっているかを理解するには、第 2 項で何が起こっているかを調べる必要があります。これは、他の項がある累乗にx log(x)比例するためです。x log(x)

変換を使用する必要があります。

ここに画像の説明を入力

この変換の後、ロピタルの規則を使用できます。

ここに画像の説明を入力

その変換を微分すると、次のようになります。

ここに画像の説明を入力

log(x)*xしたがって、x が 0 に近づくと項が 0 に近づくと計算しました。他の連続する項もゼロに近づき、第 2 項よりも速く近づくことは容易にわかります。

したがって、点x=0で、シリーズは になり1 + 0 + 0 + 0 + ...、したがって 1 に等しくなります。

于 2015-11-03T16:26:32.250 に答える