জাভা স্ক্রিপ্টের সর্বোচ্চ সংখ্যার মানটি কী যে কোনও সংখ্যক নির্ভুলতা না হারিয়েই যেতে পারে?


951

এটি কি ভাষা দ্বারা সংজ্ঞায়িত করা হয়? একটি সংজ্ঞায়িত সর্বোচ্চ আছে? এটি বিভিন্ন ব্রাউজারে আলাদা?


5
Github.com/MikeMcl/big.js এর মতো লাইব্রেরিগুলির সাথে আপনার জেএসের সীমাবদ্ধতার উপর নির্ভর করার দরকার নেই , এর নির্ভরযোগ্যতা পরীক্ষার জন্য এখানে
দিমিত্রি

2
আপনি বিগ.জেএস দিয়ে সর্বোচ্চ সংখ্যার মানটি কী ব্যবহার করতে পারেন?
জর্জ

@ জর্জিটি এখানে বিগ.জেএসপি এপিআই রয়েছে: মাইকেএমসিএল.github.io/big.js/#dp
সিংহুমিলিকো

প্রশ্নটির কোনও মানে হয় না। এটির অর্থ কী যে কোনও সংখ্যার পূর্ণসংখ্যার মান "যায়"? আপনি যদি জেএস-তে প্রতিনিধিত্ব করতে পারেন এমন সর্বোচ্চ সংখ্যকটি কী তা জানতে চান, সর্বোচ্চ (সীমাবদ্ধ) নম্বরটি নিজেই একটি পূর্ণসংখ্যা।
ভেকি

@ দিমিত্রিজেটসেভ আমাদের আর কোনও বাহ্যিক গ্রন্থাগারের উপর নির্ভর করতে হবে না (কিছু ব্রাউজারে, কমপক্ষে)। 1n << 10000nকোনও নির্ভুলতা না হারিয়ে, কোনও নির্ভরতার প্রয়োজন ছাড়াই (এবং কোনও সীমা ছাড়িয়েও বলা বাহুল্য) সত্যই, সত্যই বড় একটি পূর্ণসংখ্যা।
আমদান

উত্তর:


867

জাভাস্ক্রিপ্টের দুটি সংখ্যার প্রকার রয়েছে: Numberএবং BigInt

সর্বাধিক ব্যবহার করা সংখ্যার ধরণটি Numberহ'ল একটি 64-বিট ভাসমান পয়েন্ট আইইইই 754 নম্বর।

এই ধরণের বৃহত্তম বৃহত্তম নিখুঁত মানটি Number.MAX_SAFE_INTEGERহ'ল:

  • 2 53 -1, বা
  • +/- 9,007,199,254,740,991, বা
  • নয় কোয়াড্রিলিয়ন সাত ট্রিলিয়ন এক শত উনান্বই বিলিয়ন দুই শত পঞ্চান্ন কোটি সাত শত চল্লিশ হাজার নয় শত একানব্বই

এটিকে দৃষ্টিকোণে রাখার জন্য: এক কোয়াড্রিলিয়ন বাইট হ'ল পেটাবাইট (বা এক হাজার টেরাবাইট)।

এই প্রসঙ্গে "নিরাপদ" বলতে হ'ল পূর্ণসংখ্যার প্রতিনিধিত্ব করার ক্ষমতা এবং তাদের সঠিকভাবে তুলনা করার ক্ষমতা বোঝায়।

অনুমান থেকে:

মনে রাখবেন যে সমস্ত ধনাত্মক এবং নেতিবাচক পূর্ণসংখ্যার দৈর্ঘ্য 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 সংখ্যাটির বিষয়ে প্রযুক্তিগত নোট: এই মানটির সঠিক আইইইই-754 উপস্থাপনা রয়েছে এবং আপনি একটি ভেরিয়েবল থেকে এই মানটি নির্ধারণ ও পড়তে পারেন, সুতরাং খুব সাবধানতার সাথে নির্বাচিত অ্যাপ্লিকেশনগুলির জন্য পূর্ণসংখ্যার ডোমেনের চেয়ে কম বা সমান এই মানটি, আপনি এটি সর্বাধিক মান হিসাবে বিবেচনা করতে পারেন।

সাধারণ ক্ষেত্রে, আপনাকে অবশ্যই এই আইইইই -754 মানটিকে নির্ভুল হিসাবে বিবেচনা করতে হবে, কারণ এটি 9,007,199,254,740,992 বা 9,007,199,254,740,993 লজিক্যাল মান এনকোড করছে কিনা তা অস্পষ্ট।


75
এটি সঠিক বলে মনে হচ্ছে, তবে কোথাও কোথাও এটির সংজ্ঞা দেওয়া আছে, C লা সি এর ম্যাক্সপেক্ট বা জাভার পূর্ণসংখ্যা MA MAX_VALUE?
তাল্লামা

48
4294967295 === Math.pow(2,32) - 1;
CoolAJ86

13
তাহলে সঠিক নির্ভুলতা নিশ্চিত করতে আমরা সবচেয়ে ছোট এবং বৃহত্তম পূর্ণসংখ্যাটি কীটি ব্যবহার করতে পারি?
পেসারিয়ার

38
সম্ভবত লক্ষণীয় যে জাভাস্ক্রিপ্টে কোনও প্রকৃত (অন্তর্নিহিত) নেই। সংখ্যার প্রতিটি উদাহরণ (ভাসা) বা NAN Na
বিটরুট-বিটরুট

53
9007199254740992 আসলে সর্বাধিক মান নয়, এখানে শেষ বিট ইতিমধ্যে শূন্য বলে ধরে নেওয়া হয়েছে এবং সুতরাং আপনি 1 বিট নির্ভুলতা হারিয়ে ফেলেছেন। আসল সুরক্ষিত নম্বরটি 9007199254740991 (সংখ্যা। এমএক্সওয়েজরি0INTEGER)
উইলেম ডি'হ্যাসিলার

461

> = ইএস 6:

Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;

<= ইএস 5

রেফারেন্স থেকে :

Number.MAX_VALUE;
Number.MIN_VALUE;


23
আমি সর্বাধিক পূর্ণসংখ্যার মানগুলি সর্বাধিক সংখ্যার মানটি চাওয়ার বিষয়ে সুনির্দিষ্ট হওয়ার জন্য প্রশ্নটি সম্পাদনা করেছি, কেবলমাত্র সর্বোচ্চ সংখ্যা মানটি নয়। বিভ্রান্তির জন্য দুঃখিত, এখানে।
তাল্লামা

5
প্রত্যাবর্তিত ফলাফলটি কি সমস্ত ব্রাউজারে সমান হওয়ার গ্যারান্টিযুক্ত?
পেসারিয়ার

7
নোটটি Number.MIN_VALUEহ'ল সম্ভাব্যতমতম ধনাত্মক সংখ্যা। অন্তত মান (যেমন কম অন্য কিছু আর) সম্ভবত -Number.MAX_VALUE
মাইকেল শ্যাপার

34
ES6 পরিচয় করিয়ে দেয় Number.MIN_SAFE_INTEGERএবংNumber.MAX_SAFE_INTEGER
সুপারলুকাস

2
সুতরাং, এই ক্ষেত্রে, আমরা কি উত্তরটি ভোট দেওয়া উচিত কারণ এটি আপডেট হওয়া প্রশ্নের জন্য ভুল, বা পিটার বেলি উত্তর দেওয়ার সময় সঠিক ছিল বলেই ছেড়ে দেওয়া উচিত?
রকেটসারেফ্ট

112

এটি 2 53 == 9 007 199 254 740 992 This এটি Number52-বিট ম্যান্টিসায় ভাসমান-পয়েন্ট হিসাবে সংরক্ষণ করা হয়।

ন্যূনতম মান -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


1
যদিও কোনও বুদ্ধিমান সময়সীমার লুপের জন্য i += 1000000000
এটির

2
@ নিনজাজেকো, তিনি শুরু করেছেন ম্যাক্সএনপিওটি থেকে তাই শেষ হবে ঠিক সেখানে। এছাড়াও আই + = 1000000000 ব্যবহার করা এটিকে আর অসীম লুপ হিসাবে তৈরি করবে না। চেষ্টা করে দেখুন
টেড বিঘাম

@ টেডবিঘাম: আহ উফ, এর মাধ্যমে খুব দ্রুত প্রস্তুত ছিল। আমাকে দুবার সংশোধন করার জন্য ধন্যবাদ
নিনজেকেকো

জিমির যুক্তিটি এখানে 9,007,199,254,740,992 এর পরিবর্তে 9,007,199,254,740,991 এর জন্য দেখুন । এটি, আমার ফলো-আপের সাথে মিলিত, অনুপ্রেরণামূলক বলে মনে হচ্ছে।
টিজে ক্রাউডার

60

জাভাস্ক্রিপ্টে, একটি নাম্বার রয়েছে Infinity

উদাহরণ:

(Infinity>100)
=> true

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

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

এটি এই বিষয় সম্পর্কিত কিছু প্রশ্নের জন্য যথেষ্ট হতে পারে।


25
কিছু আমাকে বলে অনন্ত পূর্ণসংখ্যা হিসাবে যোগ্যতা অর্জন করে না। :)
ডিভাইস 1

7
minআপনি যখন কোনও ন্যূনতম মান সন্ধান করেন তবে ভেরিয়েবল শুরু করার পক্ষে এটি যথেষ্ট ভাল ।
djjeck

9
দ্রষ্টব্যInfinity - 1 === Infinity
এইচ.ওয়াল্পার

2
এছাড়াও (অনন্ত <100) => মিথ্যা এবং ম্যাথ.পা (2,1024) === অনন্ত
সিজভ

6
এটি নেতিবাচক ইনফিনিটিও পরিচালনা করে না এমন কোনও মূল্য নেই। তাই1 - Infinity === -Infinity
ডিএমসেকেবে

41

জিমির উত্তরটি সঠিকভাবে অবিচ্ছিন্ন জাভাস্ক্রিপ্ট পূর্ণসংখ্যার বর্ণনাকে -9007199254740992 থেকে 9007199254740992 অন্তর্ভুক্ত হিসাবে অন্তর্ভুক্ত করেছে (দুঃখিত 9007199254740993, আপনি মনে করতে পারেন আপনি 9007199254740993, তবে আপনি ভুল! নিচে বা জেএসফিডে বিক্ষোভ প্রদর্শন )।

console.log(9007199254740993);

যাইহোক, এই উত্তরসূচীটি খুঁজে পাওয়ার / প্রমাণ করার কোনও উত্তর নেই (কুলএএজে 86 তার উত্তরটি যা 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);


8
@ CoolAJ86: lol, আমি 15 মার্চ 2040 উন্মুখ করছি আমাদের সংখ্যা মেলে যদি আমরা একটি দল :) নিক্ষেপ করা উচিত
Briguy37

var x = ম্যাথ.পো (2,53) -3; যখন (x! = x + 1) x ++; -> 9007199254740991
মিকএলএইচ

@MickLH: আমি সঙ্গে 9007199254740992 পেতে যে কোড । আপনি কোন জাভাস্ক্রিপ্ট ইঞ্জিনটি পরীক্ষা করতে ব্যবহার করছেন?
ব্রিগ্যুই 37

আপনি নিজের কোড সহ 9007199254740992 পান, আমি x এর চূড়ান্ত মানটি ব্যবহার করিনি, তবে ব্যর্থতার কারণে x ++ এর চূড়ান্ত বিবর্তন। গুগল ক্রোম বিটিডব্লিউ।
মিকএলএইচ

@ ম্যাকএলএইচ: মূল্যায়ন x++আপনাকে বর্ধিত হওয়ার আগে x এর মান দেয় , যাতে সম্ভবত তাত্পর্যটি ব্যাখ্যা করা হয়। আপনি যদি এক্সের চূড়ান্ত মান হিসাবে একই জিনিসটির কাছে মূল্যায়ন করতে চান তবে আপনার এটি পরিবর্তন করা উচিত ++x
পিটারফ্লিন

32

নিরাপদ হতে

var MAX_INT = 4294967295;

যুক্তি

আমি ভেবেছিলাম যে আমি চতুর হয়ে উঠব এবং x + 1 === xআরও মানসম্পন্ন পদ্ধতির সাথে মানটি খুঁজে পাব।

আমার মেশিনটি প্রতি সেকেন্ডে কেবলমাত্র 10 মিলিয়ন গণনা করতে পারে ... তাই আমি 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);
}());

4
পরীক্ষার জন্য আপনি কেবল 2 ^ 53 - 2 এ এটি শুরু করতে পারবেন না? (হ্যাঁ আপনি করতে পারেন, আমি এটি চেষ্টা করেছি, এমনকি নিরাপদ থাকার জন্য -3 দিয়েও: var x = ম্যাথ.পা (2,53) -3; যখন (x! = x + 1) x ++;) -> 9007199254740991
মিকএলএইচ

চমৎকার উত্তর! তদুপরি, আমি জানি মান স্থায়ী হয় তবে কেন এটির সন্ধানের জন্য বাইনারি অনুসন্ধান ব্যবহার করবেন না?
হাইগুয়ারো

1
তাতে মজা কী? : এছাড়া @ Briguy37 এটি আমাকে মারতে stackoverflow.com/a/11639621/151312
CoolAJ86

নোট করুন যে 32 টি বিটের উপর ভিত্তি করে এই 'নিরাপদ' MAX)T তারিখের মানগুলির সাথে তুলনা করার সময় কাজ করবে না। 4294967295 তাই গতকাল!
জেরি

1
উত্তরটি "নিরাপদ থাকতে: var MAX_INT = 4294967295;" হাস্যকর নয়। আপনি যদি বিটশিফিং করছেন না, তবে এটি সম্পর্কে চিন্তা করবেন না (যদি না আপনার 4294967295 এর চেয়ে বড় ইন্টের প্রয়োজন হয়, তবে আপনার সম্ভবত এটি স্ট্রিং হিসাবে সংরক্ষণ করা উচিত এবং একটি বিগিন্ট লাইব্রেরি ব্যবহার করা উচিত)।
CoolAJ86

29

সংক্ষিপ্ত উত্তরটি "এটি নির্ভর করে"।

আপনি যদি কোথাও বিটওয়াইড অপারেটর ব্যবহার করছেন (বা যদি আপনি কোনও অ্যারের দৈর্ঘ্য উল্লেখ করছেন), সীমাগুলি হ'ল:

স্বাক্ষরবিহীন: 0…(-1>>>0)

সাইন ইন করুন: (-(-1>>>1)-1)…(-1>>>1)

(এটি এমনটি ঘটে যে বিটওয়াইজ অপারেটর এবং একটি অ্যারের সর্বাধিক দৈর্ঘ্য 32-বিট পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ)

আপনি যদি বিটওয়াইজ অপারেটর ব্যবহার করছেন না বা অ্যারের দৈর্ঘ্যের সাথে কাজ করছেন না:

সাইন ইন করুন: (-Math.pow(2,53))…(+Math.pow(2,53))

এই সীমাবদ্ধতাগুলি "সংখ্যা" ধরণের অভ্যন্তরীণ উপস্থাপনার দ্বারা আরোপিত হয়, যা সাধারণত আইইইই 754 ডাবল-স্পষ্টতা ভাসমান-পয়েন্ট উপস্থাপনার সাথে মিলে যায়। (নোট করুন যে সাধারণ স্বাক্ষরিত পূর্ণসংখ্যার বিপরীতে, অভ্যন্তরীণ উপস্থাপনার বৈশিষ্ট্যগুলির কারণে negativeণাত্মক সীমাটির দৈর্ঘ্য ইতিবাচক সীমাটির পরিমাণের সমান, যা আসলে একটি নেতিবাচক 0 অন্তর্ভুক্ত করে !)


এক্সটি 32 বিট পূর্ণসংখ্যা বা স্বাক্ষরবিহীন পূর্ণ পূর্ণসংখ্যায় কীভাবে রূপান্তর করতে হয় সে সম্পর্কে আমি হোঁচট খেতে চেয়েছিলাম এই উত্তর। তার জন্য আপনার উত্তরকে অগ্রাহ্য করলেন।
চার্লি অ্যাফমিগাটো

29

ECMAScript 6:

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

1
সাবধান! এটি (এখনও) সমস্ত ব্রাউজার দ্বারা সমর্থিত নয়! আজ আইওএস (এমনকি ক্রোমও নয়), সাফারি এবং আইই পছন্দ করে না।
ক্রেগক্স

5
দয়া করে উত্তরটি মনোযোগ সহকারে পড়ুন, আমরা ECMAScript in এ সংখ্যা.ম্যাক্সিউজরি0INTEGER এর ডিফল্ট প্রয়োগকরণ ব্যবহার করছি না, আমরা ম্যাথ.পো (2, 53) -1 দ্বারা এটি সংজ্ঞায়িত করছি
ওয়াইকিট কুং

আমি ভেবেছিলাম এটি ইসিএমএ 6 এ কীভাবে বাস্তবায়িত হয় তার একটি রেফারেন্স মাত্র! : পিআই আমার মন্তব্যটি এখনও বৈধ বলে মনে করেন। সমস্ত প্রসঙ্গে। ;)
ক্রেগক্স

3
MAX_SAFE_INTEGERপিছনে কাজ করে সমস্ত ব্রাউজারে গণনা করা কি নির্ভরযোগ্য ? পরিবর্তে আপনি কি এগিয়ে যেতে হবে? অর্থাৎ, সংখ্যা।
kjv

কি Math.pow(2, 53)-1একটি নিরাপদ অপারেশন? এটি বৃহত্তম সুরক্ষিত পূর্ণসংখ্যার চেয়ে বড় goes
ioquatix

21

ফলাফলের আগেই দেখিয়েছেন থেকে অনেক উত্তর trueএর 9007199254740992 === 9007199254740992 + 1তা যাচাই করতে 9 007 199 254 740 991 সর্বোচ্চ এবং নিরাপদ পূর্ণসংখ্যা।

যদি আমরা জমে থাকা চালিয়ে যাই:

input: 9007199254740992 + 1  output: 9007199254740992  // expected: 9007199254740993
input: 9007199254740992 + 2  output: 9007199254740994  // expected: 9007199254740994
input: 9007199254740992 + 3  output: 9007199254740996  // expected: 9007199254740995
input: 9007199254740992 + 4  output: 9007199254740996  // expected: 9007199254740996

আমরা এটি জানতে পেরেছিলাম যে 9 007 199 254 740 992 এর বেশি সংখ্যার মধ্যে কেবলমাত্র সংখ্যাগুলিও প্রতিনিধিত্বযোগ্য

এটি কীভাবে ডাবল-নির্ভুলতা 64-বিট বাইনারি ফর্ম্যাটটিতে কাজ করে তা বোঝানোর জন্য এটি একটি প্রবেশদ্বার । আসুন দেখুন 9 007 199 254 740 992 এই বাইনারি ফর্ম্যাটটি ব্যবহার করে অনুষ্ঠিত হবে (উপস্থাপিত)।

এটি দেখানোর জন্য একটি সংক্ষিপ্ত সংস্করণ ব্যবহার করে 4 503 599 627 370 496 :

  1 . 0000 ---- 0000  *  2^52            =>  1  0000 ---- 0000.  
     |-- 52 bits --|    |exponent part|        |-- 52 bits --|

তীরটির বাম দিকে, আমাদের বিট মান 1 , এবং একটি সংলগ্ন রেডিক্স পয়েন্ট রয়েছে , তারপরে গুণক দ্বারা2^52 আমরা মূলত 52 টি ধাপে রেডিক্স পয়েন্টটি সরাই এবং এটি শেষে চলে যায়। এখন আমরা বাইনারি 4503599627370496 পাই।

সমস্ত বিট 1 সেট না করা পর্যন্ত এখন আমরা এই মানটিতে 1 টি জমা করতে শুরু করি যা দশমিক 9007 199 254 740 991 এর সমান ।

  1 . 0000 ---- 0000  *  2^52  =>  1  0000 ---- 0000.  
                       (+1)
  1 . 0000 ---- 0001  *  2^52  =>  1  0000 ---- 0001.  
                       (+1)
  1 . 0000 ---- 0010  *  2^52  =>  1  0000 ---- 0010.  
                       (+1)
                        . 
                        .
                        .
  1 . 1111 ---- 1111  *  2^52  =>  1  1111 ---- 1111. 

এখন, কারণ ডাবল-স্পষ্টতা ision৪- বিট বাইনারি বিন্যাসে , এটি ভগ্নাংশের জন্য 52 বিটকে কঠোরভাবে বরাদ্দ করে , আরও 1 টি যোগ করার জন্য আর কোনও বিট বহন করার জন্য উপলব্ধ নেই, তাই আমরা যা করতে পারি তা হল সমস্ত বিট 0-এ সেট করা, এবং ঘাতক অংশটি পরিচালনা করুন:

  |--> This bit is implicit and persistent.
  |        
  1 . 1111 ---- 1111  *  2^52      =>  1  1111 ---- 1111. 
     |-- 52 bits --|                     |-- 52 bits --|

                          (+1)
                                     (radix point has no way to go)
  1 . 0000 ---- 0000  *  2^52 * 2  =>  1  0000 ---- 0000. * 2  
     |-- 52 bits --|                     |-- 52 bits --|

  =>  1 . 0000 ---- 0000  *  2^53 
         |-- 52 bits --| 

এখন আমরা 9 007 199 254 740 992 পেয়েছি , এবং এটির চেয়ে বেশি সংখ্যার সাথে, ফর্ম্যাটটি ভগ্নাংশের 2 গুণ হতে পারে , এর অর্থ এখন ভগ্নাংশের অংশে প্রতিটি 1 যোগ আসলে 2 সংখ্যার সমান হয়, এজন্য দ্বিগুণ -প্রিফিকেশন 64-বিট বাইনারি ফর্ম্যাটটি বিজোড় সংখ্যাগুলি ধরে রাখতে পারে না যখন সংখ্যাটি 9 007 199 254 740 992 এর বেশি হয় :

                            (consume 2^52 to move radix point to the end)
  1 . 0000 ---- 0001  *  2^53  =>  1  0000 ---- 0001.  *  2
     |-- 52 bits --|                 |-- 52 bits --|

সুতরাং যখন সংখ্যাটি 9007 199 254 740 992 * 2 = 18 014 398 509 481 984 এর বেশি হয়ে যায়, ভগ্নাংশের কেবল 4 বার অনুষ্ঠিত হতে পারে:

input: 18014398509481984 + 1  output: 18014398509481984  // expected: 18014398509481985
input: 18014398509481984 + 2  output: 18014398509481984  // expected: 18014398509481986
input: 18014398509481984 + 3  output: 18014398509481984  // expected: 18014398509481987
input: 18014398509481984 + 4  output: 18014398509481988  // expected: 18014398509481988

[ 2 251 799 813 685 248 , 4 503 599 627 370 496 ) এর মধ্যে সংখ্যাটি কেমন ?

 1 . 0000 ---- 0001  *  2^51  =>  1 0000 ---- 000.1
     |-- 52 bits --|                |-- 52 bits  --|

রেডিক্স পয়েন্টের পরে বিট মান 1 হুবহু 2 ^ -1 হয়। (= 1/2 , = 0.5) সুতরাং যখন সংখ্যা 4 503 599 627 370 496 (2 ^ 52) এর চেয়ে কম হবে তখন পূর্ণসংখ্যার 1/2 বার উপস্থাপনের জন্য একটি বিট পাওয়া যায় :

input: 4503599627370495.5   output: 4503599627370495.5  
input: 4503599627370495.75  output: 4503599627370495.5  

2 251 799 813 685 248 (2 ^ 51) এর চেয়ে কম

input: 2251799813685246.75   output: 2251799813685246.8  // expected: 2251799813685246.75 
input: 2251799813685246.25   output: 2251799813685246.2  // expected: 2251799813685246.25 
input: 2251799813685246.5    output: 2251799813685246.5

// If the digits exceed 17, JavaScript round it to print it.
//, but the value is held correctly:

input: 2251799813685246.25.toString(2) 
output: "111111111111111111111111111111111111111111111111110.01"
input: 2251799813685246.75.toString(2) 
output: "111111111111111111111111111111111111111111111111110.11"
input: 2251799813685246.78.toString(2)   
output: "111111111111111111111111111111111111111111111111110.11"

এবং এক্সপোনেন্ট অংশের উপলব্ধ রেঞ্জটি কী? ফর্ম্যাটটি এর জন্য 11 বিট বরাদ্দ করে। উইকির সম্পূর্ণ বিন্যাস : (আরও তথ্যের জন্য দয়া করে সেখানে যান)

আইইইই 754 ডাবল ফ্লোটিং পয়েন্ট ফর্ম্যাট.এসভিজি

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, খাঁটি অংশটি 2 ^ 52 হতে আমাদের ঠিক e = 1075 সেট করতে হবে।


13

অন্যান্যরা ইতিমধ্যে জেনেরিক উত্তরটি দিয়েছেন, তবে আমি ভেবেছিলাম এটির দ্রুত নির্ধারণ করার পক্ষে এটি একটি ভাল ধারণা হবে:

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

যা আমাকে ক্রোম 30 এ এক মিলিসেকেন্ডেরও কম সময়ের মধ্যে 9007199254740992 দেয়।

এটি 2 এর শক্তির পরীক্ষা করবে যা কোনটি 1 যুক্ত করার সাথে সাথে নিজেকে সমান করে।


ভাবা হতে পারে এটি আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করতে পারে।
Sapphire_Brick

8

বিটওয়াইজ অপারেশনের জন্য আপনি যে কোনও কিছু ব্যবহার করতে চান তা অবশ্যই 0x80000000 (-2147483648 বা -2 ^ 31) এবং 0x7fffffff (2147483647 বা 2 ^ 31 - 1) এর মধ্যে হওয়া উচিত।

কনসোল আপনাকে বলবে যে 0x80000000 সমান +2147483648, তবে 0x80000000 এবং 0x80000000 সমান -2147483648।


6

চেষ্টা করুন:

maxInt = -1 >>> 1

ফায়ারফক্স 3.6 এ এটি 2 ^ 31 - 1।


2
@ আদারনটন: আপনি নিশ্চিত যে আপনি কী করছেন তা আমি নিশ্চিত নই। ^মানে শক্তি উত্থাপিত । জাভাস্ক্রিপ্ট কনসোলে ^কি XOR , উত্থাপিত নয়
কুমারহর্ষিশ

2
Chrome / ফায়ারফক্স কনসোল খুলুন। 5 ^ 2 টাইপ করুন। বাইনারি মধ্যে, 5 হয় 101এবং 2 হয় 010। এখন, যদি আপনি 5(101) ^ 2(010) = 7(111) এগুলি দ্বিখণ্ডিত করেন তবে আপনি এটি পড়ুন যদি আপনি বিশ্বাসী হন তবে এখানে যা আলোচনা করা হচ্ছে Math.pow()তা ^অপারেটর নয়
কুমারহর্ষ

3
আবার আমি মোটেই বিভ্রান্ত নই। আমি যা লিখেছি সে সম্পর্কে মন্তব্য করেছি এবং উজ্জীবিত করেছি । ম্যাথ.পাউ () যদি বোঝানো হয় তবে এটিই লিখতে হবে। জাভাস্ক্রিপ্ট সম্পর্কে একটি প্রশ্নের উত্তরে, আলাদা ভাষার সিনট্যাক্স ব্যবহার করা অনুচিত। জাভা স্ক্রিপ্টে বৈধ যে সিনট্যাক্সটি ব্যবহার করা এটি আরও বেশি অনুচিত, তবে জাভাস্ক্রিপ্টে এমন একটি ব্যাখ্যার সাথে যার উদ্দেশ্যটি তার চেয়ে আলাদা অর্থ রয়েছে।
ড্যানোরটন

10
2 ^ 31 কীভাবে একজন ইংরেজীতে একত্রিশতম শক্তিতে দুজন লিখেছেন। এটি কোনও কোড ব্লকে নেই। আপনি যে কেউ ব্যবহার করছেন তার সম্পর্কে অভিযোগ করবেন; একটি উত্তরে, কারণ এটি জাভাস্ক্রিপ্টের একটি আলাদা অর্থ সহ একটি চরিত্র?
lmm

3
এমনকি এক যদিও উচিত লিখতে 2³¹ এবং 2 ^ 31 কারণ অধিকাংশ কীবোর্ড লেআউট ডিফল্টরূপে যারা অক্ষর নেই প্লেইন টেক্সট তার সাধারণ তা করার। কমপক্ষে আমার এই উত্তরটির অর্থ কী তা বোঝার কোনও সমস্যা হয়নি।
জোকে

6

লেখার মুহূর্তে জাভাস্ক্রিপ্ট একটি নতুন ডাটা টাইপ গ্রহণ হয়: BigInt। এটি চতুর্থ পর্যায়ে টিসি 39 প্রস্তাবটি ইকমাস্ক্রিপ্ট 2020 এ অন্তর্ভুক্ত করা হবেBigIntChrome 67+, ফায়ারফক্স 68+, অপেরা 54 এবং নোড 10.4.0 এ উপলব্ধ। এটি সাফারিতে চলছে, ইত্যাদি ... এটি "n" প্রত্যয়যুক্ত সংখ্যাসূচককে পরিচয় করিয়ে দেয় এবং নির্বিচারে নির্ভুলতার জন্য অনুমতি দেয়:

var a = 123456789012345678901012345678901n;

যথার্থতা এখনও হারিয়ে যাবে, অবশ্যই যখন এই জাতীয় সংখ্যা (সম্ভবত অনিচ্ছাকৃতভাবে) কোনও সংখ্যার ডেটা প্রকারের জন্য জোর করা হয়।

এবং, স্পষ্টতই, সীমাবদ্ধ মেমরির কারণে সর্বদা যথাযথ সীমাবদ্ধতা থাকবে এবং প্রয়োজনীয় স্মৃতি বরাদ্দ করতে এবং এ জাতীয় বিশাল সংখ্যক গাণিতিক সম্পাদনের জন্য সময়ের প্রয়োজনে ব্যয় হবে।

উদাহরণস্বরূপ, এক লক্ষ দশমিক সংখ্যা সহ একটি সংখ্যার প্রজন্ম সমাপ্তির আগে একটি লক্ষণীয় বিলম্ব গ্রহণ করবে:

console.log(BigInt("1".padEnd(100000,"0")) + 1n)

...কিন্তু এটি কাজ করে.


4

আমি একটি সূত্র, এক্স- (এক্স + 1) = - 1 দিয়ে একটি সাধারণ পরীক্ষা করেছি এবং একাদশের সবচেয়ে বড় মান সাফারি, অপেরা এবং ফায়ারফক্সে (ওএস এক্সে পরীক্ষিত) কাজ করতে পারে 9e15 is আমি পরীক্ষার জন্য যে কোডটি ব্যবহার করেছি তা এখানে:

javascript: alert(9e15-(9e15+1));

1
নোট করুন যে 9e15 = 2 ^ 53 (@ জিমির উত্তর দেখুন)।
কীলক

6
9e15 = 9000000000000000000. 2 ^ 53 = 9007199254740992. অতএব পেডেন্টিক হতে, 9e15 প্রায় 2 ^ 53 (দুটি উল্লেখযোগ্য সংখ্যা সহ) এর প্রায় সমান।
ডিভাইস 1

@chaiguy 9000000000000000এখানে 1 টি গুরুত্বপূর্ণ চিত্র রয়েছে। `9007199254740992` এ 15 উল্লেখযোগ্য পরিসংখ্যান রয়েছে।
রই নমির

@ রোয়নিমির এখানে অর্থহীন যুক্তি শুরু করতে চাইছেন না, তবে 9000000000000000000 এ 16 টি উল্লেখযোগ্য সংখ্যা রয়েছে। আপনি যদি কেবল 1 চান তবে এটি 9x10 ^ 15 হিসাবে লিখতে হবে।
ডিভাইস 1

1
@ শাইগুয়ে নং 9000000000000000যেমনটি রয়েছে - তে 1এসএফ আছে। যেখানে 90*10^14২. ( সিগফিগস্ক্যালকুলেটর.এপস্পট.কম ) এবং ম্যাথসফার্স.ম্যাসি.এইজ / অ্যালজেব্রা / ডেসিমালস / সিগফিগ এইচটিএম (নীচের বিভাগ)
রই নমির

3

আমি এটি লিখি:

var max_int = 0x20000000000000;
var min_int = -0x20000000000000;
(max_int + 1) === 0x20000000000000;  //true
(max_int - 1) < 0x20000000000000;    //true

Int32 জন্য একই

var max_int32 =  0x80000000;
var min_int32 = -0x80000000;

3

সূত্রের দিকে আসা যাক

বিবরণ

MAX_SAFE_INTEGERধ্রুব একটি মান আছে 9007199254740991(9,007,199,254,740,991 বা ~ 9 কোয়াড্রিলিয়ন)। এই সংখ্যার পিছনে যুক্তিটি হ'ল জাভাস্ক্রিপ্ট আইইইই 754 তে উল্লিখিত হিসাবে ডাবল-স্পষ্টতা ফ্লোটিং-পয়েন্ট ফর্ম্যাট নম্বরগুলি ব্যবহার করে এবং কেবল নিরাপদে এবং এর মধ্যে সংখ্যাগুলি উপস্থাপন করতে পারে ।-(2^53 - 1)2^53 - 1

এই প্রসঙ্গে নিরাপদ পূর্ণসংখ্যার প্রতিনিধিত্ব করার ক্ষমতা এবং তাদের সঠিকভাবে তুলনা করার জন্য বোঝায়। উদাহরণস্বরূপ, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2সত্যকে মূল্যায়ন করবে, যা গাণিতিকভাবে ভুল। দেখুন Number.isSafeInteger () আরও তথ্যের জন্য।

যেহেতু সংখ্যারMAX_SAFE_INTEGER একটি স্থিতিশীল সম্পত্তি , আপনি সর্বদা এটি তৈরি করেছেন এমন একটি সংখ্যা অবজেক্টের সম্পত্তি হিসাবে নয় ।Number.MAX_SAFE_INTEGER

ব্রাউজার সামঞ্জস্য

এখানে চিত্র বর্ণনা লিখুন




-1

স্কাতো কব্জি:

বিটওয়াইজ অপারেশনের জন্য আপনি যে কোনও কিছু ব্যবহার করতে চান তা অবশ্যই 0x80000000 (-2147483648 বা -2 ^ 31) এবং 0x7fffffff (2147483647 বা 2 ^ 31 - 1) এর মধ্যে হওয়া উচিত।

কনসোল আপনাকে বলবে যে 0x80000000 সমান +2147483648, তবে 0x80000000 এবং 0x80000000 সমান -2147483648

হেক্স-ডেসিমাল স্বাক্ষরিত ইতিবাচক মান, সুতরাং 0x80000000 = 2147483648 - গাণিতিকভাবে সঠিক। আপনি যদি এটিকে একটি স্বাক্ষরিত মান করতে চান তবে আপনাকে ডান শিফট করতে হবে: 0x80000000 >> 0 = -2147483648। পরিবর্তে আপনি 1 << 31 লিখতে পারেন।


-7

ফায়ারফক্স 3 টি বিশাল সংখ্যক সমস্যা বলে মনে হচ্ছে না।

1e + 200 * 1e + 100 জরিমানাটি 1e + 300 তে গণনা করবে।

সাফারিটিরও এটির সাথে কোনও সমস্যা নেই বলে মনে হচ্ছে। (রেকর্ডের জন্য, যদি অন্য কেউ এটি পরীক্ষা করার সিদ্ধান্ত নেয় তবে এটি ম্যাকের মধ্যে রয়েছে))

দিনের এই সময়ে যদি আমি আমার মস্তিষ্ক হারিয়ে না ফেলেছি তবে এটি 64-বিট সংখ্যার চেয়ে অনেক বড় bigger


18
এটি একটি bit৪ বিট পূর্ণসংখ্যার নয়, এটির একটি -৪-বিট ভাসমান পয়েন্ট সংখ্যা, যার মধ্যে ৫২/৫৩ বিট পূর্ণসংখ্যার অংশ। সুতরাং এটি 1e300 অবধি পরিচালনা করবে তবে সঠিক নির্ভুলতার সাথে নয়।
জিমি

4
জিমি ঠিক আছে। আপনার ব্রাউজারে বা জেএস কমান্ড লাইনে এটি ব্যবহার করে দেখুন:100000000000000010 - 1 => 100000000000000020
রায়ান 21

-7

নোড.জেএস এবং গুগল ক্রোম উভয়ই 1024 বিট ভাসমান পয়েন্ট মান ব্যবহার করছে বলে মনে হচ্ছে:

Number.MAX_VALUE = 1.7976931348623157e+308

1
-1: সর্বাধিক উপস্থাপনযোগ্য (অ-নির্ভুল অখণ্ড) সংখ্যাটি 2 ^ 1024 হতে পারে, তবে এর অর্থ এই নয় যে তারা আইইইই-754 64- বিট মান থেকে বিচ্যুত হচ্ছে ।
রায় টিঙ্কার

2
MAX_INT? আপনার মানে কি MAX_VALUE?
রাউল গুইউ

3
এটি একটি ভাসমান পয়েন্টের মান সর্বাধিক । এর অর্থ এই নয় যে আপনি এত দীর্ঘ কোনও ইনট সংরক্ষণ করতে পারবেন
ফুলচ্লভ

1
বা আরও উল্লেখযোগ্য বিষয়, আপনি নির্ভুলতার ক্ষতি ছাড়াই দীর্ঘকাল নির্ভরযোগ্য কোনও সঞ্চয় করতে পারবেন না । 2^53হিসাবে উল্লেখ করা হয় MAX_SAFE_INTকারণ যে বিন্দু উপরে মানগুলি অনুমান হয়, একইভাবে ভগ্নাংশ হয়।
আইএমএসওপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.