Math.pow (0, 0) === 1 인 이유는 무엇입니까?


84

우리 모두는 0 0 이 불확실 하다는 것을 알고 있습니다.

그러나 , 자바 스크립트는 말한다 :

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

그리고 C ++ 는 똑같은 것을 말합니다.

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

왜?

나는 알고있다 :

>Math.pow(0.001, 0.001)
0.9931160484209338

그러나 왜 Math.pow(0, 0)오류가 발생 하지 않습니까? 아니면 a NaN1.


3
@zzzzBov : 표준 정의 "a <sup> b </ sup> = exp (b ln (a))"에서는 정의되지 않았습니다. "limit <sub> x-> 0 </ sub> f (x) <sup> g (x) </ sup>"로 정의하려고하면 "f"와 "g"모두 제한이 0이면 불확실 함 값은 사용자가 선택한 기능에 따라 다릅니다. (잘못 된 표기법에 대한 사과; 주석에서 위첨자를 얻는 방법을 알 수 없습니다).
Mike Seymour 2013

@MikeSeymour, 예, 저는 0⁰ (유니 코드 문자 사용)가 해당 정의에서 정의되지 않음을 알고 있습니다. 그러나 내 의견을 읽으면 인용문이 "표준 정의"가 아닌 "수학의 세계"를 참조한다는 점에 유의해야합니다. 제가 원래 언급 한 것이 바로이 차이이며이 뉘앙스를 수정하기 위해 질문이 업데이트되었습니다.
zzzzBov

2
@AJMansfield Um ... a ^ 0 = 0이 아닌 경우 a.
Beska 2013

확률의 곱에 의존하는 함수가 합리적인 결과를 제공 할 수 있습니다. 컴퓨터가 상징적 수학 프로세서라는 것은 잘못된 개념입니다. C 언어는 실제 세계에서 특정 구현을 가지고 있지만 수학적 세계는 실리콘으로 보충하기에는 너무 이상적 일 수 있습니다.
IRTFM 2011

26
이 질문의 수학적 버전 인 "왜 0 ^ 0 = 1을 자주 정의합니까?" — math.stackexchange에는 많은 좋은 답변이 있습니다. math.stackexchange.com/questions/11150/…
PLL

답변:


78

C ++ 에서 pow (0, 0) 의 결과는 기본적으로 구현 정의 된 동작입니다. 수학적으로 N^0는 항상 있어야 1하지만 0^N항상 0for 여야 하는 모순적인 상황 N > 0이 있으므로이 결과에 대해 수학적으로 기대할 수 없습니다. 이 Wolfram Alpha 포럼 게시물은 좀 더 자세한 내용을 담고 있습니다.

IEC 60559 부동 소수점 산술 지원을 다루는 섹션에서 국제 표준 (프로그래밍 언어) C에 대한 이론적 설명에 따라 pow(0,0)결과를 갖는 1것이 많은 응용 프로그램에 유용 하지만

일반적으로 C99는 숫자 값이 유용한 NaN 결과를 피합니다. [...] pow (∞, 0) 및 pow (0,0)의 결과는 모두 1입니다.이 정의를 이용할 수있는 응용 프로그램이 있기 때문입니다. 예를 들어, x (p)와 y (p)가 p = a에서 0이되는 분석 함수라면 exp (y * log (x))와 같은 pow (x, y)는 p가 접근 할 때 1에 접근합니다. ㅏ.

C ++ 업데이트

leemes가 제대로 지적한 바와 같이 나는 원래의 기준에 연결된 복잡한 버전 그동안 복잡하지 않은 그것이 버전 주장 도메인 오류 초안 C ++ 표준은 받는 다시 떨어질 초안 C 표준 모두 C99C11 섹션에서 7.12.7.4 포로 기능의 단락 2 말한다 ( 내 강조 ) :

[...] x가 0이고 y가 0이면 도메인 오류 가 발생할 수 있습니다 . [...]

내가 알 수있는 한이 동작은 지정되지 않은 동작 임을 의미합니다 . 약간의 섹션을 되감기 7.12.1 오류 조건 처리 는 다음과 같이 말합니다.

[...] 입력 인수가 수학적 함수가 정의 된 도메인 외부에있는 경우 도메인 오류가 발생합니다. [...] 도메인 오류에서 함수는 구현 정의 값을 반환합니다. 정수 표현식 math_errhandling & MATH_ERRNO가 0이 아니면 정수 표현식 errno는 값 EDOM을 획득합니다. [...]

있었다 그래서 만약 도메인 오류 다음이 될 것이다 구현 정의 행동 하지만 최신 버전 모두 gccclang의 값 errno입니다 0그것이되지 않도록 도메인 오류 그 컴파일러.

자바 스크립트 업데이트

를 들어 자바 스크립트 ECMAScript® 언어 사양 섹션에서 15.8 Math 객체 에서 15.8.2.13 펑 (x, y)는 다른 조건이 사이에 말한다 :

y가 +0이면 x가 NaN이더라도 결과는 1입니다.


1
@leemes 페이지가 잘못되었다고 생각하지만 표준은 NaN을 반환해야한다고 말하지 않습니다. 반환 값은 구현에 따라 정의됩니다. 신뢰할 수있는 출처가 아니라고 주장하는 cplusplus.com이 실제로 여기에서 더 정확합니다.
interjay

@interjay 나는 당신이 삭제 된 대답을 의미한다고 생각합니다. 나는 그것이 (내가 아닌) 반대표를 설명 할 수 있기를 바라면서 그 신뢰성에 대해서만 인용했습니다. 글쎄, 두 페이지는 모두 위키이므로 신뢰성은 인간이고 실수를 저지르는 편집자에 달려 있습니다. ;)
leemes


@ShafikYaghmour 나는 (삭제 된 답변에서) 같은 질문을 연결했습니다.
leemes nov.

1
@Alek 피드백에 감사 드리며, 다른 사람들로부터 읽고 싶은 답을 쓰려고 노력합니다. 항상 성공하지는 않지만 노력합니다. 좋은 질문을 작성하는 것은 훨씬 더 어렵습니다. 한 번만 시도해 보았고 그보다 더 많은 시간을 투자하여 답을 작성했습니다.
Shafik Yaghmour

35

JavaScript Math.pow에서 다음과 같이 정의됩니다 .

  • y가 NaN이면 결과는 NaN입니다.
  • y가 +0이면 x가 NaN이더라도 결과는 1입니다.
  • y가 −0이면 x가 NaN이더라도 결과는 1입니다.
  • x가 NaN이고 y가 0이 아니면 결과는 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입니다.

내 강조

일반적으로 모든 언어에 대한 기본 함수는 언어 사양에 설명 된대로 작동해야합니다. 때때로 여기에는 명시 적으로 "정의되지 않은 동작"이 포함되며, 여기서 결과가 무엇인지 결정하는 것은 구현 자에게 달려 있지만 정의되지 않은 동작의 경우는 아닙니다.


C99 및 C11 표준의 부록 F에는 이와 동일한 사양이 포함되어 있습니다. 구현은 __STDC_IEC_559__이 사양을 준수 함을 알리기 위해 정의해야합니다 . 부록 F는 IEC 60559 부동 소수점 산술을 설명합니다. 나는 C 사양이 Annex F (예 : pow (0, 0) == 1)를 부분적으로 준수하고 __STDC_IEC_559__.
Howard Hinnant 2013

@HowardHinnant hmmm, gccclang 의 경우 정보가 완전히 도움이되지 않을 수 있습니다.
Shafik Yaghmour 2013

6
이 답변이 도움이되는지 모르겠습니다. 물론 기능은 사양에 정의 된대로 수행해야합니다. 그러나 질문은 "왜 스펙에서 이렇게 정의 되었습니까?"가됩니다.
Beska 2013

좋은 일이 (아마도) 하드웨어에서 수행됩니다. 그렇지 않으면 이러한 모든 특수한 경우 성능이 저하됩니다. :)
Thomas

16

로 정의 단지 관례 1, 0또는 그것을 떠나 undefined. 정의 pow (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 ]


3
math.stackexchange에는 0 ^ 0 = 1 정의에 대한 많은 좋은 토론과 설명이 있습니다. math.stackexchange.com/questions/11150/…
PLL

14

Wikipedia에 따르면 :

지수의 연속성을 포함하지 않는 대부분의 설정에서 0 0 을 1로 해석 하면 공식이 단순화되고 정리에 특별한 경우가 필요 하지 않습니다 .

0**0각각에 대해 장단점 을 처리 할 수있는 몇 가지 가능한 방법이 있습니다 (자세한 내용은 Wikipedia 참조 ).

IEEE 754-2008 부동 소수점 표준은 세 가지 다른 기능을 권장합니다 :

  • pow로 취급 0**0됩니다 1. 이것은 가장 오래된 정의 버전입니다. 거듭 제곱이 정확한 정수이면 결과는 for와 같고 pown, 그렇지 않으면 결과는와 같습니다 powr(일부 예외적 인 경우 제외).
  • pown0 ** 0을 1로 처리합니다. 거듭 제곱은 정확한 정수 여야합니다. 값은 음의 염기에 대해 정의됩니다. 예 : pown(−3,5)입니다 −243.
  • powr0 ** 0을 NaN (Not-a-Number – 정의되지 않음)으로 처리합니다. 이 값은 powr(−3,2)밑 수가 0보다 작은 경우에도 NaN입니다 . 값은 exp (power '× log (base))로 정의됩니다.

6

도널드 크 누스

1992 년에이 논쟁은 다음과 같이 해결되었습니다.

여기에 이미지 설명 입력

그리고 그의 논문 Two Notes on Notation 에서 더 자세히 설명했습니다 .

기본적으로, 우리의 한계로 1가없는 동안 f(x)/g(x)모두를위한 모든 기능 f(x)g(x), 그것은 여전히 훨씬 간단 정의 할 조합론하게 0^0=1, 그리고 당신과 같은 기능을 고려해야 할 몇 가지 장소에서 특별한 경우를 확인 후 0^x, 어떤 어쨌든 이상합니다. 결국 x^0훨씬 더 자주 등장합니다.

이 주제에 대해 내가 아는 몇 가지 최고의 토론 (Knuth 논문 제외)은 다음과 같습니다.


일부를 읽지 않았다면 제로의 제로 거듭 제곱 의 답을 읽어보십시오 ...? 답변 중 일부가이 접근 방식을 다루어야하는 질문과 연결되어 있습니다.
Shafik Yaghmour 2013


5

C 언어 정의에 따르면 (7.12.7.4/2) :

x가 0이고 y가 0이면 도메인 오류가 발생할 수 있습니다.

또한 (7.12.1 / 2) :

도메인 오류에서 함수는 구현 정의 값을 반환합니다. 정수 표현식 math_errhandling & MATH_ERRNO가 0이 아니면 정수 표현식 errno는 값 EDOM을 획득합니다. 정수 표현식 math_errhandling & MATH_ERREXCEPT가 0이 아닌 경우 ''유효하지 않은 ''부동 소수점 예외가 발생합니다.

기본적으로 값 math_errhandling되고 MATH_ERRNO, 그래서 확인 errno값에 EDOM.


1
웁스! 정말 흥미 롭군요! 나는 사용하여 내 CPP 파일 컴파일g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.
Ionică Bizău

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 분의 1입니다. '음의 곱셈'은 나눗셈이기 때문입니다. 4로 두 번 나눕니다.

a ^ (1/2)는 root (a)입니다. 왜냐하면 a의 근으로 무언가 를 곱하는 것은 자신을 a로 곱하는 것 보다 곱셈 작업의 절반이기 때문입니다. (4 ^ (1/2)) ^ 2


0

이를 이해하려면 미적분을 풀어야합니다.

여기에 이미지 설명 입력

x^xTaylor 시리즈를 사용하여 0 주위로 확장 하면 다음을 얻습니다.

여기에 이미지 설명 입력

따라서 제한 x이 0이 될 때 무슨 일이 일어나는지 이해 하려면 두 번째 항에서 무슨 일이 일어나는지 알아 내야합니다. x log(x)다른 항은 x log(x)어느 정도 거듭 제곱에 비례하기 때문 입니다.

변환을 사용해야합니다.

여기에 이미지 설명 입력

이제이 변환 후에 우리는 L' Hôpital의 규칙을 사용할 수 있습니다 .

여기에 이미지 설명 입력

그 변화를 차별화하면 다음과 같은 결과를 얻을 수 있습니다.

여기에 이미지 설명 입력

따라서 log(x)*xx가 0에 가까워지면 항이 0에 가까워 진다고 계산했습니다. 다른 연속 항도 0에 가까워지고 두 번째 항보다 더 빠르다는 것을 쉽게 알 수 있습니다.

따라서 지점 x=0에서 시리즈는 1 + 0 + 0 + 0 + ...1이됩니다.


이 대답은 인상적이지만 수학에서 함수가 x에서 연속적이지 않은 한 f (x)의 x-> a로 제한이 반드시 f (a)와 같지는 않다는 점에 주목할 가치가 있습니다.
jasonszhao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.