javascript - issues - browser online




ما هي القيمة الصحيحة القصوى لجافا سكريبت التي يمكن أن ينتقل إليها الرقم دون فقدان الدقة؟ (14)

هل هذا محدد من قبل اللغة؟ هل هناك حد أقصى محدد؟ هل هو مختلف في المتصفحات المختلفة؟


لتصبح بمأمن

var MAX_INT = 4294967295;

منطق

ظننت أنني سأكون ذكياً وأجد القيمة التي x + 1 === x مع نهج أكثر واقعية.

يمكن لجهازي أن يحسب 10 ملايين فقط في الثانية أو نحو ذلك ... لذا سأعيد الرد بإيجاز في 28.56 سنة.

إذا كنت لا تستطيع الانتظار كل هذا الوقت ، فأنا على استعداد للمراهنة على ذلك

  • لا تعمل معظم الحلقات الخاصة بك لمدة 28.56 سنة
  • 9007199254740992 === Math.pow(2, 53) + 1 هو دليل كافٍ
  • يجب عليك التمسك بـ 4294967295 وهو Math.pow(2,32) - 1 لتجنب المشكلات المتوقعة مع 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);
}());

ECMAScript 6:

Number.MAX_SAFE_INTEGER = Math.pow(2, 53)-1;
Number.MIN_SAFE_INTEGER = -Number.MAX_SAFE_INTEGER;

اساسا javascript لا يدعم طويلة.
حتى بالنسبة للقيم العادية التي يمكن أن تمثل أقل من 32 بت ، ستستخدم حاوية نوع int. للحصول على قيم عددية أكبر ثم 32 بت ، فإن استخدامها مزدوج. في represntation مزدوجة الجزء الصحيح 53 بت والباقي هو عشري (للحفاظ على معلومات النقطة العائمة).
بحيث يمكنك استخدام 2^53 - 1 بقيمة 9007199254740991
يمكنك الوصول إلى القيمة لاستخدامها في التعليمات البرمجية الخاصة بك بواسطة Number.MAX_SAFE_INTEGER


الجواب القصير هو أن يتوقف."

إذا كنت تستخدم معاملات البايت في أي مكان (أو إذا كنت تشير إلى طول المصفوفة) ، فإن النطاقات هي:

غير موقعة: 0…(-1>>>0)

توقيع: (-(-1>>>1)-1)…(-1>>>1)

(يحدث ذلك أن يتم تقييد عوامل البتات والحد الأقصى لطول مصفوفة إلى الأعداد الصحيحة 32 بت).

إذا كنت لا تستخدم معالجات البتّات أو تعمل بأطوال الصفيف:

التوقيع: (-Math.pow(2,53))…(+Math.pow(2,53))

يتم فرض هذه القيود من خلال التمثيل الداخلي لنوع "الرقم" ، والذي يتوافق عمومًا مع تمثيل نقطة عائمة مزدوجة الدقة IEEE 754. (لاحظ أنه على عكس الأعداد الصحيحة الموقعة النموذجية ، يكون حجم الحد السالب هو نفس حجم الحد الموجب ، بسبب خصائص التمثيل الداخلي ، والذي يتضمن فعليًا صفرًا سلبيًا !)


تمثل إجابة جيمي بشكل صحيح الطيف صحيح جافا سكريبت المستمر كما -9007199254740992 إلى 9007199254740992 ضمنا (آسف 9007199254740993 ، قد تعتقد أنك 9007199254740993 ، ولكن كنت على خطأ! مظاهرة أدناه أو في jsfiddle ).

document.write(9007199254740993);

ومع ذلك ، لا توجد إجابة تكتشف / تثبت هذا بشكل برمجي (باستثناء جهاز CoolAJ86 الذي ألمح إليه في إجابته التي تنتهي في 28.56 عامًا ؛) ، لذا إليك طريقة أكثر فعالية قليلاً للقيام بذلك (على وجه الدقة ، إنها أكثر كفاءة حوالي 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);


في JavaScript ، يوجد رقم يسمى Infinity .

أمثلة:

(Infinity>100)
=> true

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

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

قد يكون هذا كافياً لبعض الأسئلة المتعلقة بهذا الموضوع.


قد يكون الآخرون قد أعطوا الإجابة العامة بالفعل ، لكنني اعتقدت أنه من المستحسن إعطاء طريقة سريعة لتحديدها:

for (var x = 2; x + 1 !== x; x *= 2);
console.log(x);

والذي يعطيني 9007199254740992 في غضون أقل من ملي ثانية في Chrome 30.

سيختبر صلاحيات 2 لإيجاد أي واحد ، عندما "يضاف" 1 ، يساوي نفسه.


كتب Scato:

يجب أن يكون أي شيء تريد استخدامه لعمليات التثبيث بين 0x80000000 (-2147483648 أو -2 ^ 31) و 0x7fffffff (2147483647 أو 2 ^ 31 - 1).

ستخبرك وحدة التحكم أن 0x80000000 يساوي +2147483648 ، ولكن 0x80000000 و 0x80000000 يساوي -2147483648

هيكس-عشرية هي قيم إيجابية غير موقعة ، لذلك 0x80000000 = 2147483648 - thats رياضيًا صحيحًا. إذا كنت تريد جعله قيمة موقعة ، فيجب أن تقوم بالتبديل إلى اليمين: 0x80000000 >> 0 = -2147483648. يمكنك كتابة 1 << 31 بدلاً من ذلك أيضًا.


محاولة:

maxInt = -1 >>> 1

في Firefox 3.6 ، يكون 2 ^ 31 - 1.


ومن 2 53 == 9 007 199 254 740 992. وذلك لأن يتم تخزين Number s كنقطة عائمة في عشري 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


يبدو أن كلا من Node.js و Google Chrome يستخدمان قيم نقطة عائمة 1024 بت:

Number.MAX_VALUE = 1.7976931348623157e+308

يجب أن يكون أي شيء تريد استخدامه لعمليات التثبيث بين 0x80000000 (-2147483648 أو -2 ^ 31) و 0x7fffffff (2147483647 أو 2 ^ 31 - 1).

ستخبرك وحدة التحكم أن 0x80000000 يساوي +2147483648 ، ولكن 0x80000000 و 0x80000000 يساوي -2147483648.


> = ES6: Number.MIN_SAFE_INTEGER; Number.MAX_SAFE_INTEGER; Number.MIN_SAFE_INTEGER; Number.MAX_SAFE_INTEGER;

<= ES5

من المرجع : Number.MAX_VALUE; Number.MIN_VALUE; Number.MAX_VALUE; Number.MIN_VALUE;

console.log('MIN_VALUE', Number.MIN_VALUE);
console.log('MAX_VALUE', Number.MAX_VALUE);

console.log('MIN_SAFE_INTEGER', Number.MIN_SAFE_INTEGER); //ES6
console.log('MAX_SAFE_INTEGER', Number.MAX_SAFE_INTEGER); //ES6


+/- 9007199254740991

قسم ECMA 8.5 - أرقام

لاحظ أن جميع الأعداد الصحيحة الموجبة والسالبة التي لا يزيد حجمها عن 2 53 يمكن تمثيلها في نوع الرقم (في الواقع ، يحتوي الرقم 0 على تمثيلين ، +0 و −0).

وهي قيم نقطة عائمة 64 بت ، وهي أكبر قيمة تكاملية بالضبط هي 2 9007199254740991 ، أو 9007199254740991 . في ES6 ، يتم تعريف هذا على أنه Number.MAX_SAFE_INTEGER .

لاحظ أن مشغلي bitwise و مشغلات shift يعملان على 32-bit ints ، لذا في هذه الحالة ، يكون العدد الصحيح الآمن الأقصى هو 2 31 -1 ، أو 2147483647.

اختبرها!

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
x / 2;      // 4503599627370496
x >> 1;     // 0
x | 1;      // 1






cross-browser