Programing

NaN ^ 0 == 1 인 이유

lottogame 2020. 11. 22. 18:49
반응형

NaN ^ 0 == 1 인 이유


이전 코드 골프의 한 지점에서 프롬프트가 표시되는 이유는 다음과 같습니다.

>NaN^0
[1] 1

것이 완벽한 의미가 NA^0있기 때문에 1로 NA데이터가 누락되며, 어떤 0으로 제기 번호가 포함 1, 줄 것이다 -InfInf. 그러나 NaN숫자가 아님 을 나타내야하는데 왜 그렇게 될까요? ?NaN상태에 대한 도움말 페이지가 다음과 같은 경우 더욱 혼란 스럽거나 걱정됩니다 .

R에서 기본적으로 모든 수학 함수 (기본 산술 포함)는 입력 또는 출력으로 +/- Inf 및 NaN과 함께 올바르게 작동해야합니다.

기본 규칙은 Infs와의 호출 및 관계가 실제로 적절한 수학적 한계가있는 명령문이라는 것입니다.

NaN을 포함하는 계산은 NaN 또는 NA를 반환합니다 .이 두 가지 중 어느 것이 보장되지 않고 R 플랫폼에 의존 할 수 있습니다 (컴파일러가 계산을 재정렬 할 수 있기 때문에).

이것 뒤에 철학적 인 이유가 있습니까, 아니면 R이 이러한 상수를 나타내는 방법과 관련이 있습니까?


이것은에서 참조하는 도움말 페이지에서 참조됩니다. ?'NaN'

"ANSI / IEEE 754 부동 소수점 표준이라고도하는 IEC 60559 표준.

http://en.wikipedia.org/wiki/NaN . "

그리고 거기에서 NaN을 만들어야하는 것에 관한 다음 진술을 찾을 수 있습니다.

 "There are three kinds of operations that can return NaN:[5]
       Operations with a NaN as at least one operand.

참조한 참고 사항에 의해 표시되는 특정 C 컴파일러에서 가져온 것일 수 있습니다. 다음은 GNU C 문서에 나와있는 내용입니다.

http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

"반면에 NaN은이를 포함하는 모든 계산을 감염시킵니다. 계산이 NaN을 대체 한 실제 값에 관계없이 동일한 결과를 생성하지 않는 한 결과는 NaN입니다."

따라서 GNU-C 사람들은 코드를 작성할 때 다른 표준을 염두에 두는 것 같습니다. 그리고 ANSI / IEEE 754 부동 소수점 표준의 2008 버전은 다음과 같이 제안합니다.

http://en.wikipedia.org/wiki/NaN#Function_definition

공개 된 표준은 무료가 아닙니다. 따라서 액세스 권한이나 돈이있는 경우 여기를 볼 수 있습니다.

http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933


대답은 "역사적인 이유로"로 요약 될 수 있습니다.

그것은 IEEE 754이 개 도입 것으로 보인다 다른 전원 기능을 - pow그리고 powr후자는 보존과, NaN'영업의 경우 S와도 반환 NaN을 위해 Inf^0, 0^0, 1^Inf, 결국 후자로 떨어졌다 여기에 간단히 설명 .

개념적으로 저는 NaN보존 캠프에 있습니다. 왜냐하면 한계의 관점에서이 문제를 다루고 있기 때문입니다.하지만 편의적인 관점에서 볼 때 현재의 관습이 많은 것을 만들지 않더라도 다루기가 약간 더 쉬울 것으로 예상합니다. 어떤 경우에는 의미가 있습니다 (예 : sqrt(-1)^0모든 연산이 실수에있는 동안 1과 같음).


네, 여기 늦었지만이 디자인에 참여한 R Core 멤버로서 위에서 언급 한 내용을 기억하겠습니다. NaN 보존 및 NA 보존 작업은 R에서 "동등하게"작업하므로 NA ^ 0이 1을 제공해야한다는 데 동의하면 NaN ^ 0 |-> 1이 결과입니다.

실제로 (다른 사람들이 말했듯이) 그러한 질문에 답하려면 C 또는 IEEE 표준이 아닌 R의 도움말 페이지를 읽어야하며 SimonO101은 올바르게 인용했습니다.

1 ^ y 및 y ^ 0은 항상 1입니다.

그리고 나는 그것의 저자가 아니라면 내가 많이 관여했다고 확신합니다. 다른 프로그래밍 언어가 다르게 작동하는 경우에도 NaN이 아닌 답변을 제공 할 수있는 것이 나쁘지 않은 것이 아니라 좋은 점에 유의하십시오 . 이러한 규칙의 결과는 더 많은 것들이 자동으로 올바르게 작동한다는 것입니다. 다른 경우에는 R 프로그래머가 더 특별한 케이스를 직접 수행하도록 촉구 받았을 것입니다.

다르게 말하면, 위와 같은 간단한 규칙 (모든 경우에 NaN이 아닌 값을 반환)은 수학적 의미에서 연속성을 전파하기 때문에 좋은 규칙입니다 : lim_x f (x) = f (lim x). NaN을 전파하는 것보다 위의 "= 1"규칙을 고수하는 것이 분명한 경우 (즉, 특별한 대소 문자가 필요하지 않았습니다. 반복합니다.) 몇 가지 경우가 있습니다. 더 자세히 말했듯이 sqrt (-1) ^ 0도 그러한 예 입니다. 복잡한 평면으로 확장하자마자 1 올바른 결과이기 때문입니다.


여기에 한 가지 이유가 있습니다. 에서 골드버그 :

IEEE 754에서 NaN은 종종 지수 e_max + 1과 0이 아닌 유효 숫자가있는 부동 소수점 숫자로 표시됩니다.

그래서 NaN부동 소수점 숫자는 비록 특별한 의미입니다. 숫자를 0의 거듭 제곱으로 올리면 지수가 0으로 설정되므로 더 이상 NaN이 아닙니다.

또한 참고 :

> 1^NaN
[1] 1

1은 지수가 이미 0 인 숫자입니다.


개념적으로 유일한 문제 NaN^0 == 1는 0 값이 적어도 네 가지 다른 방식으로 나올 수 있지만 IEEE 형식은 그 중 세 가지에 대해 동일한 표현을 사용한다는 것입니다. 위의 공식은 가장 일반적인 경우 (세 가지 중 하나)에 대해서는 동일하지만 다른 경우에는 그렇지 않습니다.

BTW, 내가 인정할 네 가지 경우는 다음과 같습니다.

  • 리터럴 0
  • 부호없는 0 : 구별 할 수없는 두 숫자의 차이
  • 양의 무한소 : 0과 구별하기에는 너무 작은 두 개의 일치하는 부호의 곱 또는 몫.
  • Negative infinitesimal: The product or quotient of two numbers of opposite sign, which is too small to be distinguished from zero.

Some of these may be produced via other means (e.g. literal zero could be produced as the sum of two literal zeros; positive infinitesimal by the division of a very small number by a very large one, etc.).

If a floating-point recognized the above, it could usefully regard raising NaN to a literal zero as yielding one, and raising it to any other kind of zero as yielding NaN; such a rule would allow a constant result to be assumed in many cases where something that might be NaN would be raised to something the compiler could identify as a constant zero, without such assumption altering program semantics. Otherwise, I think the issue is that most code isn't going to care whether x^0 might would NaN if x is NaN, and there's not much point to having a compiler add code for conditions code isn't going to care about. Note that the issue isn't just the code to compute x^0, but for any computations based on that which would be constant if x^0 was.


If you look at the type of NaN, it is still a number, it's just not a specific number that can be represented by the numeric type.

EDIT:

For example, if you were to take 0/0. What is the result? If you tried to solve this equation on paper, you get stuck at the very first digit, how many zero's fit into another 0? You can put 0, you can put 1, you can put 8, they all fit into 0*x=0 but it's impossible to know which one the correct answer is. However, that does not mean the answer is no longer a number, it's just not a number that can be represented.

Regardless, any number, even a number that you can't represent, to the power of zero is still 1. If you break down some math x^8 * x^0 can be further simplified by x^(8+0) which equates to x^8, where did the x^0 go? It makes sense if x^0 = 1 because then the equation x^8 * 1 explains why x^0 just sort of disappears from existence.

참고URL : https://stackoverflow.com/questions/17863619/why-does-nan0-1

반응형