কোনও সংখ্যা অনন্তের মূল্যায়ন করে কিনা তা আমি কীভাবে পরীক্ষা করব?


95

আমার কাছে জাভাস্ক্রিপ্ট গণনার একটি সিরিজ রয়েছে যা ব্যবহারকারীর পছন্দগুলির উপর নির্ভর করে (কেবলমাত্র আইই এর অধীনে) অনন্ততা দেখায়।

কীভাবে কেউ শব্দটি Infinityউপস্থিত হওয়া বন্ধ করে এবং উদাহরণস্বরূপ, 0.0পরিবর্তে প্রদর্শন করবে ?

উত্তর:


176
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

আপনি isFiniteকীভাবে চিকিত্সা করতে চান তার উপর নির্ভর করে আপনি সম্ভবত ফাংশনটি ব্যবহার করতে পারেন NaNisFiniteফেরৎ falseআপনার নম্বর হলে POSITIVE_INFINITY, NEGATIVE_INFINITYবা NaN

if (isFinite(result))
{
    // ...
}

4
এর Number.(POSITIVE|NEGATIVE)_INFINITYপরিবর্তে -?Infinityবা কেন ব্যবহার করবেন -?1/0?
এলি গ্রে

4
@ এলি: বিশ্বব্যাপী Infinityসম্পত্তি কেবল পঠনযোগ্য নয় যার অর্থ এটি পুনরায় সংজ্ঞায়িত করা যায়: উদাহরণস্বরূপ, "সত্য"var x = 42; Infinity = 42; alert(x === Infinity); প্রদর্শন করে । (স্বীকার করে নিই যে এটি একটি অস্পষ্ট মামলা, এবং যে কেউ পুনরায় সংজ্ঞা দেওয়ার সিদ্ধান্ত নেয় , তার উচিত বিজোড় বিষয়গুলির প্রত্যাশা করা উচিত))InfinityNaN
লূক এইচ

সত্য যে উপেক্ষা Number.(POSITIVE|NEGATIVE)_INFINITYকরা হয় পারেন শুধুমাত্র পাঠযোগ্য নয়, Infinity হয় শুধুমাত্র পাঠযোগ্য কঠোর মোডে। এছাড়াও, -?1/0আমি আপনার কাছে যে বিষয়টি উপস্থাপন করেছি তা সম্পর্কে কী ? যাইহোক, আপনার isFiniteপরিবর্তে প্রায় সর্বদা ব্যবহার করা উচিত ।
এলি গ্রে

4
@Eli: আমার পরীক্ষা Number.POSITIVE_INFINITYএবং Number.NEGATIVE_INFINITY করছে শুধুমাত্র পাঠযোগ্য (Chrome8, FF3.6 এবং IE8 উপর পরীক্ষা)। ব্যবহার দুর্দান্ত 1/0কাজ করে তবে আপনি যে কোডটির জন্য পরীক্ষার চেষ্টা করছেন তা আপনার কোড রক্ষণাবেক্ষণকারীদের পক্ষে এতটা স্পষ্ট হবে না। আমি সম্মত হই যে ব্যবহার isFiniteকরা প্রায়শই সর্বদা সর্বোত্তম উপায় - এজন্য আমি আমার উত্তরে এটি উল্লেখ করেছি - তবে কেবল ওপি সিদ্ধান্ত নিতে পারে যে এটি তাদের প্রয়োজনীয়তা পূরণ করে কিনা।
লুক

4
এগুলি কেবল পঠনযোগ্য নয় (পঠনযোগ্য: অ-কনফিগারযোগ্য ) নয়, তারা কেবল গেটর সহ অ্যাকসেসর তবে সেটটার নেই। আপনি তাদের সাথে পুনরায় সংজ্ঞায়িত করতে Object.definePropertyএবং __defineGetter__Infinityঅন্যদিকে, হয় কঠোর মোডে অ কনফিগারযোগ্য।
এলি গ্রে

9

একটি সাধারণ n === n+1বা n === n/0কাজ:

function isInfinite(n) {
  return n === n/0;
}

সচেতন থাকুন যে দেশীয় isFinite()সংখ্যাগুলি সংখ্যায় প্রবেশ করে। isFinite([])এবং isFinite(null)উভয় trueউদাহরণস্বরূপ।


এই উত্তরটি সরল ভুল। n === n+12 ^ 53, অর্থাৎ 1e30 এর চেয়ে বড় সংখ্যার জন্য সত্যের মূল্যায়ন করে। ডিভিশন হ্যাক কাজ করে, এমনকি এনএএন এবং -ইনফিনিটির জন্যও। যাইহোক, লুকের উত্তরটি আপনাকে আরও পাঠযোগ্য কোড দেয়।
tglas

@tglas কেন প্লাসটি এর মতো? খুশি বিভাগ শক্ত। আইএমও আমার কোডটি আরও পঠনযোগ্য এবং আরও অন্তর্ভুক্তি কারণ শব্দের চেয়ে গণিত আরও সার্বজনীন।
ryanve

4
কারণ আইইইই 64 বিট ফ্লোটের 53 টি উল্লেখযোগ্য বাইনারি অঙ্ক রয়েছে (দেখুন en.wikedia.org/wiki/IEEE_754 ), তাই n+1প্রতিনিধিত্ব করা যায় না এবং গোলাকার সাপেক্ষে। ভাল, এমনকি পূর্ণসংখ্যাগুলি গোলাকৃতির ত্রুটি দ্বারা প্রভাবিত হয়। বিটিডব্লু, আমি মনে করি না যে আপনার কোডটি "গণিত-প্রুফ", কেবল চেষ্টা করুন n === n/-0। + /- ইনফ দিয়ে বাস্তবগুলি সমাপ্ত করার সময়, অন্তর্নিহিত শূন্য ক্রমটিকে ইতিবাচক বলে ধরে না নিলে আপনার সীমাটি সঠিকভাবে সংজ্ঞায়িত হবে না।
tglas

ধন্যবাদ @ টিগ্লাস আমি সর্বদা পছন্দ করব যে জাভাস্ক্রিপ্ট শূন্য দ্বারা বিভক্ত হতে পারে :)
ryanve

6

ইন ES6, Number.isFinite()পদ্ধতিটি নির্ধারণ করে যে পাস করা মান একটি সীমাবদ্ধ নম্বর।

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

ECMAScript 1
মোহামাদ

2

আসলে n === n + 1 ৫১ বিটের চেয়ে বড় সংখ্যার জন্য কাজ করবে, যেমন

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

4
এটি রাইভের উত্তরের মন্তব্য হওয়া উচিত।
গ্যারি

1

আমি লোড্যাশকে বিভিন্ন ধরণের প্রতিরক্ষামূলক কোডিং কারণে পাঠযোগ্যতার জন্য ব্যবহার করতে পছন্দ করি । ES6 Number.isFiniteদুর্দান্ত এবং অ-সংখ্যাসূচক মানগুলির সাথে সমস্যা নেই তবে ES6 যদি সম্ভব না হয় তবে আপনার কাছে ইতিমধ্যে লোটাস রয়েছে, বা ব্রিফার কোড চান: _.আইসফিনেন্ট

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

0

আমি একটি দৃশ্যকল্প আমাকে যদি মান কিনা চেক করা প্রয়োজন গাড়ীতে আঘাত করেছি NaNবা Infinityটাইপ কিন্তু বৈধ ফলাফল হিসাবে স্ট্রিং পাস। যেহেতু অনেকগুলি পাঠ্য স্ট্রিং মিথ্যা-ইতিবাচক উত্পন্ন করবে NaN, আমি এ থেকে বিরত থাকার একটি সহজ সমাধান করেছি made

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

উপরের কোড মানগুলিকে স্ট্রিংয়ে রূপান্তরিত করে এবং সেগুলি NaN বা ইনফিনিটির সমানভাবে সমান কিনা তা পরীক্ষা করে (আপনার নেতিবাচক অনন্ততার জন্য অন্য একটি মামলা যুক্ত করতে হবে)।

সুতরাং:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

এই পোস্টটি এখানে প্রকৃত প্রশ্নের সাথে সত্যই মোকাবেলা করে না এবং স্বীকৃত উত্তরের অধীনে মন্তব্য হিসাবে আরও ভাল হত। NaN
ওপিটি

আপনি সম্ভবত সঠিক, @ কোড_ড্রেড - উপাখ্যানটি প্রাসঙ্গিক নয়। তবে সমাধানটি এখনও কাজ করে: এটি অনন্ত নম্বরটি সনাক্ত করতে পারে - দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন।
dmitrizzle

এটি বিন্দু পাশে। ইতিমধ্যে একটি উত্তর আছে যা দেখায় যে এটি কীভাবে সঠিকভাবে করা যায় । আপনার "কাজ" কেবল তাই কারণ ভাষাটি নির্বোধ কাজ করে এবং এটি কীভাবে পরিচালনা করে তার সাথে অসামঞ্জস্যপূর্ণ। এই জাতীয় হ্যাক কোড রচনা থেকে নিজেকে বাঁচান।
কোড_ড্রেড

আমি যদি এর toString()পরিবর্তে ব্যবহার করি তবে কি আপনাকে সুখী করবে ? নিচে নির্দ্বিধায় বা রাষ্ট্রের কারণগুলি কীভাবে এটি অসঙ্গতিপূর্ণ ফলাফল পেতে পারে বা ঠিক কেন এই পদ্ধতির প্রস্তাব দেওয়া হয়নি তা নির্দ্বিধায় মনে করুন। এখনও অবধি, আমি এখনও মনে করি এটি যে কারও উত্তর সন্ধান করছে তার জন্য এটি একটি বিকল্প যুক্ত করেছে এবং এটি বিপজ্জনক, অস্থির ইত্যাদি কারণগুলির কোনও ठोस কারণ নেই etc.
ठोस কারণ নেই

-1

আপনি উইন্ডোতে আইসফিনিট ব্যবহার করতে পারেন isFinite(123):

আপনি যেমন একটি ফাংশন লিখতে পারেন:

function isInfinite(num) {
 return !isFinite(num);
}

এবং ব্যবহার করুন:

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true

আপনি Number.isFinitযেটি ই সংখ্যাটি খুব বেশি কিনা তা যাচাই করতে পারেন undefinedএবং যাচাইকরণ এবং nullইত্যাদির জন্য আরও সঠিক ...

অথবা আপনি এটির মতো পলিফিল করতে পারেন:

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.