web-dev-qa-db-ja.com

Math.pow(0、0)=== 1なのはなぜですか?

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)はエラーを投げませんか?または、NaNが_1_よりも優れている可能性があります。

84
Ionică Bizău

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

pow(0,0)の結果は1になりますが、多くのアプリケーションでは Rationalale for International Standard—Programming Languages—C のセクションでIEC 60559浮動小数点演算サポート:

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

C++を更新する

リームが正しく指摘したように、私はもともとcomplexのバージョンにpowのリファレンスにリンクしていましたが、 non-complex バージョンはそれを主張していますドメインエラードラフトC++標準ドラフトC標準 にフォールバックC99およびC11セクション7.12.7.4パウの機能パラグラフ2は(emphasis mine)と言います:

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

私が知る限り、この動作は unspecified behavior ビットセクションの巻き戻し7.12.1エラー状態の処理の意味:

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

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

JavaScriptを更新

Javascriptセクション15.8ECMAScript®言語仕様The Mathオブジェクト15.8.2.13の下pow(x、y)は、他の条件の中でも特に次のことを示しています。

Yが+0の場合、xがNaNであっても結果は1です。

78
Shafik Yaghmour

JavaScriptでMath.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です。

重点鉱山

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

35
zzzzBov

_1_、_0_として定義するか、undefinedのままにするのは単なる慣例です。定義 pow(0,0) 次の定義のために広まっています:

mathematical power definition


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.1 ]

16
schmijos

ウィキペディアによると:

指数の連続性を含まないほとんどの設定では、0を解釈します as 1は式を単純化し、定理の特別な場合の必要性を排除します。

_0**0_をそれぞれ長所と短所で処理する方法はいくつかあります(詳細については Wikipedia を参照してください)。

IEEE 754-2008 浮動小数点標準では、3つの異なる機能が推奨されています。

  • powは_0**0_を_1_として扱います。これは最も古い定義済みバージョンです。パワーが正確な整数の場合、結果はpownの場合と同じです。それ以外の場合、結果はpowrの場合と同じです(例外的な場合を除く)。
  • pownは0 ** 0を1として扱います。べき乗は正確な整数でなければなりません。値は負のベースに対して定義されます。たとえば、pown(−3,5)は_−243_です。
  • powrは、0 ** 0をNaN(Not-a-Number – undefined)として扱います。値は、ベースがゼロより小さいpowr(−3,2)のような場合にもNaNです。値はexp(power '×log(base))で定義されます。
14
NPE

ドナルド・クヌース

1992年に次のようにこの議論を解決しました。

enter image description here

そして彼の論文でさらに詳しく説明しました 表記法に関する2つの注記

基本的に、すべての関数f(x)/g(x)およびf(x)ではなく、すべてのg(x)の制限として1はありませんが、コンビナトリクスの定義は非常に簡単です。 0^0=1を使用し、0^xなどの関数を考慮する必要があるいくつかの場所で特別なケースを作成します。結局、x^0はもっと頻繁に表示されます。

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

6
Thomas Ahle

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であるため、errnoの値についてはEDOMを確認してください。

5
Pete Becker

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のルートで何かを乗算すると乗法仕事の半分になるためです-何かを乗算するには2回行う必要があります4 = 4 ^ 1 =(4 ^(1/2))^ 2

0
NiloCK