+0 এবং -0 এক কি?


171

মাধ্যমে পড়া ECMAScript প্রোগ্রামিং 5.1 স্পেসিফিকেশন , +0এবং -0আলাদা করা হয়।

তাহলে +0 === -0মূল্যায়ন কেন true?



6
নোট করুন যে ES2015 এ আপনি Object.is+0 এবং -0 পার্থক্য করতে ব্যবহার করতে পারেন
বেনিয়ামিন গ্রুইনবাউম

জেএস থেকে ডেভিড ফ্লানাগানের উদ্ধৃত নির্দেশিকা : সংখ্যার ক্রিয়াকলাপের ফলাফল যখন ক্ষুদ্রতম উপস্থাপনযোগ্য সংখ্যার তুলনায় শূন্যের কাছাকাছি হয় তখন আন্ডারফ্লো হয়। এই ক্ষেত্রে, জাভাস্ক্রিপ্ট ০. ফিরে আসে যদি নেতিবাচক সংখ্যা থেকে আন্ডারফ্লো হয় তবে জাভাস্ক্রিপ্ট একটি বিশেষ মান প্রদান করে যা "নেগেটিভ শূন্য" হিসাবে পরিচিত।
আরবিটি

উত্তর:


193

জাভাস্ক্রিপ্ট সংখ্যা উপস্থাপনের জন্য আইইইই 754 মান ব্যবহার করে । উইকিপিডিয়া থেকে :

স্বাক্ষরযুক্ত শূন্য একটি সম্পর্কিত চিহ্ন সহ শূন্য। সাধারণ গাণিতিক ক্ষেত্রে, −0 = +0 = 0. তবে, কম্পিউটিংয়ে কিছু সংখ্যক উপস্থাপনা দুটি শূন্যের অস্তিত্বের অনুমতি দেয়, প্রায়শই −0 (negative ণাত্মক শূন্য) এবং +0 (ধনাত্মক শূন্য) দ্বারা চিহ্নিত হয় । এটি পূর্ণসংখ্যার জন্য কিছু স্বাক্ষরিত সংখ্যার উপস্থাপনায় এবং বেশিরভাগ ভাসমান পয়েন্ট সংখ্যা উপস্থাপনায় ঘটে। 0 নম্বরটি সাধারণত +0 হিসাবে এনকোড করা হয় তবে এটি +0 বা −0 দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

ভাসমান পয়েন্ট গণিতের জন্য আইইইই 754 স্ট্যান্ডার্ড (বর্তমানে বেশিরভাগ কম্পিউটার এবং প্রোগ্রামিং ল্যাঙ্গুয়েজ যা ভাসমান পয়েন্ট সংখ্যা সমর্থন করে) এর জন্য +0 এবং both0 উভয়ই প্রয়োজন। শূন্যগুলি বর্ধিত আসল সংখ্যা লাইনের একটি বৈকল্পিক হিসাবে বিবেচনা করা যেতে পারে যেমন 1 / −0 = −∞ এবং 1 / + 0 = + ∞, শূন্য দ্বারা বিভাগ কেবলমাত্র ± 0 / ± 0 এবং ± ∞ / ± for ।

নিবন্ধটিতে বিভিন্ন উপস্থাপনা সম্পর্কে আরও তথ্য রয়েছে।

সুতরাং এই কারণেই, প্রযুক্তিগতভাবে উভয় শূন্যকে আলাদা করতে হবে।

যাইহোক, +0 === -0মূল্যায়ন সত্য। কেন এটি (...)?

এই আচরণটি স্পষ্টভাবে বিভাগ 11.9.6 , স্ট্রাইক ইক্যুয়ালিটি তুলনা অ্যালগরিদম (আংশিকভাবে আমার উপর জোর দেওয়া):

তুলনা x === y, যেখানে xএবং yমানগুলি সত্য বা মিথ্যা উত্পাদন করে । যেমন একটি তুলনা নিম্নলিখিত হিসাবে সঞ্চালিত হয়:

(...)

  • টাইপ (x) যদি সংখ্যা হয় তবে

    1. যদি এক্স NaN হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    2. যদি YNN হয় তবে মিথ্যা প্রত্যাবর্তন করুন।
    3. X যদি y এর সমান সংখ্যার মান হয় তবে সত্যটি প্রত্যাবর্তন করুন।
    4. যদি x +0 হয় এবং y −0 হয় তবে সত্য আসুন।
    5. যদি x −0 হয় এবং y +0 হয় তবে সত্য আসুন।
    6. মিথ্যা প্রত্যাবর্তন।

(...)

( +0 == -0বিটিডব্লিউর ক্ষেত্রেও এটিই রয়েছে )

এটি যৌক্তিকভাবে চিকিত্সা করা +0এবং -0সমান হিসাবে মনে হয়। অন্যথায় আমাদের এটিকে আমাদের কোডে নেওয়া উচিত এবং আমি ব্যক্তিগতভাবে তা করতে চাই না;)


বিঃদ্রঃ:

ES2015 একটি নতুন তুলনা পদ্ধতি প্রবর্তন করে Object.is,। Object.isস্পষ্টভাবে -0এবং এর মধ্যে পার্থক্য করে +0:

Object.is(-0, +0); // false

15
সত্যই 1/0 === Infinity; // trueএবং 1/-0 === -Infinity; // true
ব্যবহারকারী 113716

48
সুতরাং আমরা 1 === 1এবং +0 === -0কিন্তু 1/+0 !== 1/-0। কত অদ্ভুত!
র্যান্ডমব্লু

8
@ র্যান্ডম: আমি মনে করি এটি অবশ্যই তুলনায় ভাল +0 !== -0)) এটি সত্যিই সমস্যা তৈরি করতে পারে।
ফেলিক্স ক্লিং

@ ফেলিক্সক্লিং, বা 0 !== +0/ 0 !== -0, যা প্রকৃতপক্ষে সমস্যাও তৈরি করবে!
ইয়ানিক রোচন

5
আসলে, এই আচরণের মডেলগুলি গণিতে সীমিত গণনা করে। উদাহরণস্বরূপ ফাংশন 1 / x এর 0 টিতে একটি মান অসীমতা রয়েছে, তবে, আমরা 0 টি নেতিবাচক দিকের ধনাত্মক থেকে এগিয়ে গেলে এটি পৃথক করা হয়; পূর্বের ক্ষেত্রে, ফলাফলটি + ইনফ, পরবর্তীকালে, - ইনফ।
অ্যাগোস্টন হরভাথ

19

আমি এটি একটি উত্তর হিসাবে যুক্ত করব কারণ আমি @ ব্যবহারকারী 113716 এর মন্তব্যকে অগ্রাহ্য করেছি।

আপনি এটি করে -0 এর জন্য পরীক্ষা করতে পারেন:

function isMinusZero(value) {
  return 1/value === -Infinity;
}

isMinusZero(0); // false
isMinusZero(-0); // true

6
সম্ভবত == 0 এর জন্যও পরীক্ষা করা উচিত, উপরেরটিটি মাইনাসজেরো (-1e-323) সত্য প্রত্যাবর্তন করে!
ক্রিস

1
@ ক্রিস, ডাবল স্পষ্টতা ব্যয়কারীর সীমা হ'ল e±308আপনার সংখ্যাটি কেবলমাত্র অস্বীকৃত আকারে উপস্থাপন করা যেতে পারে এবং এগুলি কোনও ক্ষেত্রে সমর্থন করা যায় কি না সে সম্পর্কে বিভিন্ন বাস্তবায়নের বিভিন্ন মতামত রয়েছে। -0মুল বক্তব্যটি হ'ল কিছু ভাসমান পয়েন্ট মোডের কয়েকটি মেশিনে আপনার নম্বরটি অন্য হিসাবে ডেনোরমালাইজড নম্বর হিসাবে প্রদর্শিত হয় 0.000000000000001e-308। যেমন ভাসমান, তাই মজাদার
দুর্বলস্পেস

এটি অন্যান্য ভাষার জন্যও কাজ করতে পারে (আমি সি এবং এটির জন্য পরীক্ষা করেছি)
মুকুল কুমার

11

আমি কেবল একটি উদাহরণ পেয়েছি যেখানে +0 এবং -0 সত্যিই খুব আলাদা আচরণ করে:

Math.atan2(0, 0);  //returns 0
Math.atan2(0, -0); //returns Pi

সতর্কতা অবলম্বন করুন: এমনকি ম্যাথ.গ্রাউন্ড -0.0001 এর মতো নেতিবাচক সংখ্যায় ব্যবহার করার পরেও এটি আসলে -0 হবে এবং উপরে বর্ণিত কিছু পরবর্তী গণনাগুলি স্ক্রু করতে পারে।

এটির সমাধানের দ্রুত এবং নোংরা উপায়টি হ'ল:

if (x==0) x=0;

বা শুধু:

x+=0;

এটি সংখ্যাটি -0 হলে এটি 0-এ রূপান্তর করে।


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

আমি ঠিক ম্যাথ.টান (y / x) এ এটির মুখোমুখি হয়েছি, যা (সম্ভবত আশ্চর্যরূপে) ইতিবাচক বা নেতিবাচকভাবে অসীম "y / x" পরিচালনা করতে পারে, বাদে এটি x -0 এর ক্ষেত্রে ভুল উত্তর দেয়। "X" এর পরিবর্তে "(x + 0)" এটি ঠিক করে দেয়।
জ্যাকব সি,

5

ইন আইইইই 754 মান জাভাস্ক্রিপ্ট মধ্যে নম্বর টাইপ করুন প্রতিনিধিত্ব করতে ব্যবহৃত, সাইন একটি বিট দ্বারা প্রতিনিধিত্ব করা হয় (ক 1 একটি ঋণাত্মক সংখ্যা নির্দেশ করে)।

ফলস্বরূপ, প্রতিটি প্রতিনিধিত্বমূলক সংখ্যার জন্য একটি নেতিবাচক এবং ধনাত্মক মান উভয়ই বিদ্যমান 0

এই কারণেই -0এবং উভয়ই +0বিদ্যমান।


3
টু এর পরিপূরক এছাড়াও সাইন জন্য কিছুটা ব্যবহার করে, তবে কেবল একটি শূন্য (ধনাত্মক) রয়েছে।
ফেলিক্স ক্লিং

1
হ্যাঁ তবে টু'র পরিপূরকটিতে নেতিবাচক-বিটটিও মানটির একটি অংশ, তাই একবার আপনি নেতিবাচক-বিট সেট করলে, এটি আর শূন্য নয়।
আর্নাড লে ব্ল্যাঙ্ক

3

মূল শিরোনামের উত্তর দেওয়া Are +0 and -0 the same?:

brainslugs83(এর উত্তরের মন্তব্যে Spudley) একটি গুরুত্বপূর্ণ কেসটি নির্দেশ করেছে যাতে জেএসে +0 এবং -0 এক নয় - ফাংশন হিসাবে প্রয়োগ করা হয়েছে:

var sign = function(x) {
    return 1 / x === 1 / Math.abs(x);
}

এটি মানক ব্যতীত Math.sign+0 এবং -0 এর সঠিক চিহ্নটি প্রদান করবে।


2

0 এর জন্য দুটি সম্ভাব্য মান (বিট উপস্থাপনা) রয়েছে এটি অনন্য নয়। বিশেষত ভাসমান পয়েন্ট সংখ্যাগুলিতে এটি ঘটতে পারে। কারণ ভাসমান পয়েন্ট সংখ্যাগুলি আসলে এক ধরণের সূত্র হিসাবে সঞ্চয় করা হয়।

পূর্ণসংখ্যা পৃথক উপায়েও সংরক্ষণ করা যেতে পারে। অতিরিক্ত সাইন-বিট সহ আপনার সংখ্যার মান থাকতে পারে, তাই 16 বিট স্পেসে আপনি একটি 15 বিট পূর্ণসংখ্যা মান এবং একটি সাইন-বিট সংরক্ষণ করতে পারেন। এই উপস্থাপনায়, মান 1000 (হেক্স) এবং 0000 উভয়ই 0, তবে এর মধ্যে একটি +0 এবং অন্যটি -0 হয়।

এটি পূর্ণসংখ্যার মান থেকে 1 বিয়োগ করে এড়ানো যায় তাই এটি -1 থেকে -2 ^ 16 অবধি, তবে এটি অসুবিধে হবে।

আরও সাধারণ পদ্ধতির মধ্যে 'দুটি পরিপূরক'-তে পূর্ণসংখ্যার সঞ্চয় করা হয়, তবে দৃশ্যত ইসিএমএসক্রিপ্টটি তা না করা বেছে নিয়েছে। এই পদ্ধতিতে সংখ্যাগুলি 0000 থেকে 7FFF ধনাত্মক হয়। নেতিবাচক সংখ্যাগুলি এফএফএফএফ (-1) থেকে 8000 এ শুরু হয়।

অবশ্যই, একই নিয়মগুলি বৃহত্তর পূর্ণসংখ্যার ক্ষেত্রেও প্রযোজ্য, তবে আমি চাই না আমার এফটি শেষ হয়ে যায়। ;)


4
তবে কি +0 === -0একটু অদ্ভুত মনে হয় না? কারণ এখন আমাদের আছে 1 === 1এবং +0 === -0তবে 1/+0 !== 1/-0...
র্যান্ডমব্লু

2
অবশ্যই +0 হয় -0। এ দুটোই কিছুই না। তবে + ইনফিনিটি এবং ইনফিনিটির মধ্যে একটি বিশাল পার্থক্য আছে, আছে কি? ইসিএমএ +0 এবং -1 উভয়কেই সমর্থন করার কারণগুলিতে এই অনন্যতা সংখ্যাগুলিও হতে পারে।
গোলেজট্রোল

+0 === -0দুটি বিট উপস্থাপনা ভিন্ন হওয়ার পরেও আপনি ব্যাখ্যা করবেন না ।
র্যান্ডমব্লু

1
+0 হ'ল 0, কিছু না, নাডা, নিন্তে। এটি বোঝা যায় যে তারা একই। আকাশ কেনো নীল? 4 + 3 এছাড়াও 1 + 6 এর সমান, যদিও উপস্থাপনাগুলি আলাদা। তাদের বিভিন্ন উপস্থাপনা (এবং এইভাবে একটি বিট মান) রয়েছে, তবে তুলনা করার সময় তারা একই শূন্য হিসাবে পরিচালিত হয়, যা তারা।
GolezTrol

1
তারা এক নয় । উদাহরণস্বরূপ উদাহরণস্বরূপ স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি / 7২২//17if / ডিফেরেন্টাইটিং-0- এবং -0 দেখুন ।
র‌্যান্ডম্বলিউ

2

আমরা Object.is+0 এবং -0 পার্থক্য করতে এবং আরও একটি জিনিস ব্যবহার করতে পারি NaN==NaN,।

Object.is(+0,-0) //false

Object.is(NaN,NaN) //true


0

এই ঘটনাটি ব্যাখ্যা করার জন্য উইকিপিডিয়ায় একটি ভাল নিবন্ধ রয়েছে: http://en.wikedia.org/wiki/Sided_zero

সংক্ষেপে, এটি +0 এবং -0 উভয়ই আইইইই ভাসমান পয়েন্টের স্পেসিফিকেশনগুলিতে সংজ্ঞায়িত করা হয়। উভয়ই কোনও চিহ্ন ছাড়াই 0 থেকে প্রযুক্তিগতভাবে পৃথক, যা একটি পূর্ণসংখ্যা, তবে বাস্তবে তারা সকলেই শূন্যকে মূল্যায়ন করে, তাই সমস্ত ব্যবহারিক উদ্দেশ্যে এই পার্থক্যটিকে উপেক্ষা করা যেতে পারে।


2
এটি সম্পূর্ণরূপে সঠিক নয় - উদাহরণস্বরূপ জাভাস্ক্রিপ্টে 1 / -0 == 1/0 মিথ্যাতে মূল্যায়ন করে। তারা একটি ঐন্দ্রজালিক স্বাক্ষরবিহীন শূন্য থেকে "মূল্যায়ন" না, সেখানে যেমন "একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা জিরো" আইইইই 754. এ ধরনের কোন ধারণা
BrainSlugs83
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.