방금 ( 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의 버그처럼 보입니다. 그것은 보고되었다 잘하면 곧 해결 얻을 것이다.