[javascript] Math.pow () (때때로)가 JavaScript에서 **와 같지 않은 이유는 무엇입니까?

방금 ( MDN Reference ) a**b의 대안으로 ECMAScript 7 기능 을 발견 했으며 해당 게시물 에서 분명히 다르게 동작 하는 토론을 발견했습니다 . Chrome 55에서 테스트했으며 결과가 다른 것을 확인할 수 있습니다.Math.pow(a,b)

Math.pow(99,99) 보고 3.697296376497263e+197

이므로

99**99 보고 3.697296376497268e+197

차이 로그인 그래서 Math.pow(99,99) - 99**99결과를 -5.311379928167671e+182.

지금까지는 단순히 또 다른 구현이라고 말할 수 있지만 함수로 래핑하면 다시 다르게 동작합니다.

function diff(x) {
  return Math.pow(x,x) - x**x;
}

호출 diff(99)반환 0.

왜 그럴까요?

으로 xszaboj는 지적이이 문제로 좁혀 할 수 있습니다 :

var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182



답변

99**99되어 컴파일 시간에 평가 ( “상수 폴딩”), 컴파일러의 pow루틴 로부터 다른 런타임 하나 . 평가할 때 **런타임에, 결과와 동일합니다 Math.pow– 이후 당연 **실제로 컴파일 A를 Math.pow호출 :

console.log(99**99);           // 3.697296376497268e+197
a = 99, b = 99;
console.log(a**b);             // 3.697296376497263e+197
console.log(Math.pow(99, 99)); // 3.697296376497263e+197

사실은

99 99 = 369729637649726772657187905628805440595668764281741102430259972423552570455277523421410650010128232727940978889548326540119429996769494359451621570193644014418071060667659301384999779999159200499899

따라서 첫 번째 결과는 더 나은 근사치이지만 여전히 상수 및 동적 표현 사이에 이러한 불일치가 발생해서는 안됩니다.

이 동작은 V8의 버그처럼 보입니다. 그것은 보고되었다 잘하면 곧 해결 얻을 것이다.


답변