[javascript] 숫자가 정밀도를 잃지 않고 갈 수있는 JavaScript의 최고 정수 값은 무엇입니까?

언어로 정의되어 있습니까? 정의 된 최대 값이 있습니까? 브라우저마다 다른가요?



답변

JavaScript에는 두 가지 숫자 유형이 있습니다 : NumberBigInt.

가장 자주 사용되는 숫자 유형 Number은 64 비트 부동 소수점 IEEE 754 숫자입니다.

이 유형의 가장 큰 정확한 적분 값은 Number.MAX_SAFE_INTEGER입니다.

  • 2 53-1 또는
  • +/- 9,007,199,254,740,991 또는
  • 구 십억 칠십 억 구 백억 십이 백오 십오 백만 칠십 만 구백 구십 구

이것을 1 조 1 천 바이트는 페타 바이트 (또는 1 천 테라 바이트)입니다.

이 문맥에서 “안전”은 정수를 정확하게 표현하고 정확하게 비교하는 능력을 말합니다.

사양에서 :

크기가 2 53 보다 크지 않은 모든 양수 및 음수 는 Number유형으로 표시 할 수 있습니다 (실제로 정수 0에는 +0 및 -0의 두 가지 표현이 있음).

이보다 큰 정수를 안전하게 사용하려면 다음을 사용해야합니다. BigInt 상한이없는 합니다.

비트 연산자와 시프트 연산자는 32 비트 정수에서 작동하므로이 경우 최대 안전 정수는 2 31 -1 또는 2,147,483,647입니다.

const log = console.log
var x = 9007199254740992
var y = -x
log(x == x + 1) // true !
log(y == y - 1) // also true !

// Arithmetic operators work, but bitwise/shifts only operate on int32:
log(x / 2)      // 4503599627370496
log(x >> 1)     // 0
log(x | 1)      // 1


숫자 9,007,199,254,740,992의 주제에 대한 기술 노트 :이 값의 정확한 IEEE-754 표현이 있으며 변수 에서이 값을 할당하고 읽을 수 있으므로 매우 신중하게 정수 도메인 이하의 정수 도메인에서 선택된 응용 프로그램의 경우 이 값을 최대 값으로 취급 할 수 있습니다.

일반적으로이 IEEE-754 값은 논리 값 9,007,199,254,740,992 또는 9,007,199,254,740,993을 인코딩하는지 모호하기 때문에 정확하지 않은 것으로 취급해야합니다.


답변

> = ES6 :

Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;

<= ES5

에서 참조 :

Number.MAX_VALUE;
Number.MIN_VALUE;


답변

2 53 == 9 007 199 254 740 992입니다. 이는 Numbers가 52 비트 가수에 부동 소수점으로 저장 되기 때문 입니다.

최소값은 -2 53입니다. 입니다.

이로 인해 재미있는 일이 벌어집니다

Math.pow(2, 53) == Math.pow(2, 53) + 1
>> true

그리고 위험 할 수도 있습니다 🙂

var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
    // infinite loop
}

추가 읽기 : http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html


답변

JavaScript에는이라는 숫자가 Infinity있습니다.

예 :

(Infinity>100)
=> true

// Also worth noting
Infinity - 1 == Infinity
=> true

Math.pow(2,1024) === Infinity
=> true

이 주제에 관한 몇 가지 질문에 충분할 수 있습니다.


답변

지미의 대답은 정확히 같은 연속 자바 스크립트 정수 스펙트럼을 나타낸다 -90071992547409929007199254740992 포함을 (9007199254740993 죄송합니다, 당신이 생각하는 당신이 9007199254740993하지만, 당신이 잘못!에있는
아래 또는 데모 jsfiddle을 ).

console.log(9007199254740993);

그러나이 프로그래밍 방식으로 ( 28.56 년 후에 끝날 것이라고 CoolAJ86이 그의 답변 에서 언급 한 것 이외의) 찾거나 증명하는 대답 은 없으므로 여기에 약간 더 효율적인 방법이 있습니다 (정확히 말하면 더 효율적입니다) 28.559999999968312에 대한 년에 의하여 :)하는 함께 테스트 바이올린 :

/**
 * Checks if adding/subtracting one to/from a number yields the correct result.
 *
 * @param number The number to test
 * @return true if you can add/subtract 1, false otherwise.
 */
var canAddSubtractOneFromNumber = function(number) {
    var numMinusOne = number - 1;
    var numPlusOne = number + 1;

    return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1);
}

//Find the highest number
var highestNumber = 3; //Start with an integer 1 or higher

//Get a number higher than the valid integer range
while (canAddSubtractOneFromNumber(highestNumber)) {
    highestNumber *= 2;
}

//Find the lowest number you can't add/subtract 1 from
var numToSubtract = highestNumber / 4;
while (numToSubtract >= 1) {
    while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
        highestNumber = highestNumber - numToSubtract;
    }

    numToSubtract /= 2;
}

//And there was much rejoicing.  Yay.    
console.log('HighestNumber = ' + highestNumber);


답변

안전하다

var MAX_INT = 4294967295;

추리

나는 영리하다고 생각하고 그 가치를 발견했습니다. x + 1 === x 더 실용적인 접근 방식으로 .

내 컴퓨터는 초당 천만 개 정도만 계산할 수 있으므로 28.56 년 후에 최종 답변을 게시하겠습니다.

그렇게 오래 기다릴 수 없다면 기꺼이 내기를하겠습니다

  • 대부분의 루프는 28.56 년 동안 실행되지 않습니다
  • 9007199254740992 === Math.pow(2, 53) + 1 충분히 증거입니다
  • 당신은에 충실해야 4294967295하는 것입니다 Math.pow(2,32) - 1비트 이동과 피할 예상 문제로

찾기 x + 1 === x:

(function () {
  "use strict";

  var x = 0
    , start = new Date().valueOf()
    ;

  while (x + 1 != x) {
    if (!(x % 10000000)) {
      console.log(x);
    }

    x += 1
  }

  console.log(x, new Date().valueOf() - start);
}());


답변

짧은 대답은 “그것은 달려있다”입니다.

어디서나 비트 연산자를 사용하는 경우 (또는 배열의 길이를 참조하는 경우) 범위는 다음과 같습니다.

부호없는 : 0…(-1>>>0)

서명 : (-(-1>>>1)-1)…(-1>>>1)

비트 연산자와 배열의 최대 길이는 32 비트 정수로 제한됩니다.

비트 연산자를 사용하지 않거나 배열 길이를 사용하는 경우 :

서명 : (-Math.pow(2,53))…(+Math.pow(2,53))

이러한 제한은 일반적으로 IEEE 754 배정 밀도 부동 소수점 표현에 해당하는 “Number”유형의 내부 표현에 의해 부과됩니다. (일반 부호있는 정수와 달리 음의 한계의 크기는 실제로 음의 0을 포함하는 내부 표현의 특성으로 인해 양의 한계의 크기와 같습니다 .)