একটি কম্পিউটার কি শূন্য দ্বারা ভাগ করার চেষ্টা করবে?


59

আমরা সবাই জানি 0/0হয় Undefinedএবং একটি ত্রুটি উত্পন্ন হয়ে থাকলে আমি এটি একটি ক্যালকুলেটর পুরা ছিল, এবং (অন্তত সি) যদি আমি একটি প্রোগ্রাম তৈরি করতে ছিল ওএস এটা বিনষ্ট যখন আমি শূন্য দ্বারা ভাগ করা হবে চেষ্টা করবে।

তবে আমি কী ভাবছিলাম যে কম্পিউটারটি যদি শূন্য দ্বারা ভাগ করার চেষ্টা করে , বা এটি কেবল "সুরক্ষিতভাবে নির্মিত" থাকে, যাতে এটি "দেখায়" যখন এটি 0/0গণনা করার চেষ্টা করার আগেই একটি ত্রুটি ফিরে আসে?


10
0/0 অপরিবর্তিত, অন্য কোনও সংখ্যা / 0 অন্যরকম ত্রুটি, আপনি দুটি বিভ্রান্ত বলে মনে করছেন
edc65

7
0 দ্বারা বিভাজিত যে কোনও সংখ্যা গণিতগতভাবে নির্ধারিত।
মানোডেস্ট্র্রা

12
@jwg: "যদি এর মান থাকে তবে এটি 1 হবে" - অগত্যা নয়; সেখানে গণিতের পুরো শাখা কি মান বিভিন্ন পরিস্থিতিতে হতে পারে অনুগত :)
psmears

11
পরিভাষা এখানে নির্মল করার জন্য, 0/0 একটি বলা হয় অনির্দিষ্ট ফর্ম যখন এক্স / জন্য অশূন্য 0 এক্স হয় অনির্ধারিত । 0/0 দিয়ে শেষ হওয়া একটি গণনা প্রায়শই একটি আসল উত্তর দেওয়ার জন্য বিভিন্ন উপায়ে গণনা করা যেতে পারে, যেখানে x / 0 মূলত অর্থহীন।
ইরা

9
@jwg আপনি হয়ত l'hopital এর নিয়মে আগ্রহী হতে পারেন। এমন কিছু ক্ষেত্রে অবশ্যই রয়েছে যেখানে 0/0 এর 1
টির

উত্তর:


74

সিপিইউ সনাক্তকরণ তৈরি করেছে। বেশিরভাগ নির্দেশাবলী সেট আর্কিটেকচার নির্দিষ্ট করে যে সিপিইউ ব্যতিক্রম হ্যান্ডলারকে শূন্য দ্বারা ভাগ করার জন্য ফাঁদে ফেলবে (আমি মনে করি না ডিভিডেন্ড শূন্য হলে এটি যত্ন করে)।

এটি সম্ভব যে শূণ্য বিভাজকের জন্য পরীক্ষাটি হার্ডওয়্যার সাথে সমান্তরালভাবে বিভাগ করার চেষ্টা করার সাথে ঘটেছিল, তবে, আপত্তিকর শর্তটি সনাক্তকরণ কার্যকরভাবে বিভাগ এবং ফাঁদগুলিকে বাতিল করে দেয়, সুতরাং আমরা সত্যই কিছু বলতে পারব না যে কিছু অংশ আছে কিনা এর বিভাজন চেষ্টা করেছিল বা না।

(হার্ডওয়্যার প্রায়শই এরকমভাবে কাজ করে, সমান্তরালভাবে একাধিক কাজ করে তারপরে যথাযথ ফলাফলটি বেছে নেয় কারণ তারপরে প্রতিটি অপারেশন যথাযথ ক্রিয়াকলাপের পছন্দটিতে সিরিয়ালিংয়ের পরিবর্তে এখনই শুরু করা যেতে পারে))

অতিরিক্ত প্রবাহ সনাক্তকরণ চালু করার পরে ব্যতিক্রম প্রক্রিয়াতে একই ফাঁদ ব্যবহার করা হবে, যা আপনি সাধারণত বিভিন্ন অ্যাড / সাব / মুল নির্দেশাবলী (বা সেই নির্দেশাবলীতে একটি পতাকা) ব্যবহার করে জিজ্ঞাসা করেন।

ফ্লোটিং পয়েন্ট বিভাগটি শূন্য দ্বারা বিভাজনের জন্য সনাক্তকরণেও তৈরি করেছে, তবে একটি ব্যতিক্রম হ্যান্ডলারের ফাঁদে ফেলে ভিন্ন মান ( আইইইই 754 NaN নির্দিষ্ট করে ) প্রদান করে।


হাইপোথিটিক্যালি বলতে গেলে, সিপিইউ যদি শূন্য দ্বারা ভাগ করার চেষ্টা করার জন্য কোনও সনাক্তকরণ বাদ দেয় তবে সমস্যাগুলির মধ্যে অন্তর্ভুক্ত থাকতে পারে:

  • সিপিইউতে ঝুলন্ত (উদাহরণস্বরূপ একটি ইনফ। লুপে) - এটি ঘটতে পারে যদি সিপিইউ বিভাজনের জন্য অ্যালগরিদম ব্যবহার করে থামিয়ে দেয় যখন অঙ্কটি বিভাজকের চেয়ে কম থাকে (পরম মানের ক্ষেত্রে)। এর মতো একটি হ্যাং সিপিইউকে বিধ্বস্ত করা হিসাবে গণ্য হবে।
  • একটি (সম্ভবত অনুমানযোগ্য) আবর্জনার উত্তর, যদি সিপিইউ বিভাজন পদক্ষেপের সর্বাধিক সংখ্যক (যেমন 32-বিট মেশিনে 31 বা 32) বিভাগ বিভাজন বন্ধ করার জন্য একটি কাউন্টার ব্যবহার করে।

51
@ অঙ্কুশ এ "সিস্টেম ক্রাশ" আসলে সিপিইউ স্তরে ঘটে যাওয়া কিছু নয়। কোনও সিপিইউর সবচেয়ে সম্ভবত আচরণ যা শূন্য দ্বারা বিভাজনে ফাঁদে পড়ে না তা হ'ল এটি কেবল বিভাগ অপারেশন করে, কিছু বাজে ফলাফল দেয় এবং চালিয়ে যায়। যেমন আপনি যখন দুটি পূর্ণসংখ্যা যোগ করেন তখন ওভারফ্লো হয়।
Ixrec

6
ভাসমান পয়েন্টের জন্য, "এনএএন" এবং "ট্র্যাপ" এর মধ্যে পছন্দটি সাধারণত এফপিইউতে পতাকা উল্টিয়ে স্থায়ী হয়।
ভ্যাটাইন

10
@ আঙ্কুশ lxrec যা বলেছেন তা অস্পষ্ট: সিপিইউর বিষয়ে যতটা ভাবা যায়, ক্র্যাশ হওয়ার মতো জিনিস নেই।
ব্যবহারকারী 253751

7
@ অঙ্কুশ কয়েকটি পরিস্থিতি সিপিইউ-স্তরের "সিস্টেম ক্র্যাশ" ঘটায়। এই ক্ষেত্রে আমরা তাপ সুরক্ষা শাটডাউন (অতিরিক্ত তাপ সুরক্ষা), ট্রিপল ফল্ট এবং অনুরূপ পরিস্থিতিগুলির মতো জিনিসগুলির বিষয়ে কথা বলছি । অবৈধ ওপকোড সহ সাধারণ ব্যবহারে আপনি যে প্রায় প্রতিটি ক্র্যাশের মুখোমুখি হবেন তা আটকা পড়ে এবং কিছুটা পুনরুদ্ধার করে পরিচালনা করা হয়, বা কেবল ত্রুটি উপেক্ষা করে এবং সম্ভাব্য অপরিষ্কার অবস্থায় চালিয়ে যাওয়া সম্ভবত কিছু ত্রুটি পতাকা স্থাপন করে।
একটি সিভিএন

8
আপনি যদি শূন্য দ্বারা বিভাজনকে ফাঁদে ফেলেন না, তবে ফলাফলটি প্রোগ্রামিং পার্লেন্সে, "অপরিজ্ঞাত আচরণ"। এর অর্থ কম্পিউটার কিছু করতে পারে। এটি, যেমন বার্গি উল্লেখ করেছেন, একটি বগি লুপ প্রবেশ করুন এবং স্তব্ধ হয়ে যেতে পারে। এটি কেবল কিছু অনির্দিষ্ট সিরিজের বিটগুলি আউটপুট করতে পারে যা তাদের বিভাজন যুক্তির প্রয়োগের ফলে ঘটেছিল (মনে রাখবেন, একটি কম্পিউটার গাণিতিক অর্থে "বিভাজন" করে না It এটি দুটি সংখ্যায় একটি অপারেশন করে, যা বিভাজনের যথেষ্ট কাছাকাছি যে আমরা সাধারণত এটি "বিভাগ" বলতে পারি .. ফ্লোটিং পয়েন্ট রাউন্ডওফটিও দেখুন)।
কর্ট

34

এটি আপনি সংখ্যার বা ভাসমান পয়েন্ট সংখ্যাগুলি ব্যবহার করছেন কিনা তা নির্ভর করে, ভাষার সংকলকটির উপর, নির্ভর করে।

ভাসমান পয়েন্ট সংখ্যাটির জন্য, বেশিরভাগ বাস্তবায়নগুলি আইইইই 754 স্ট্যান্ডার্ড ব্যবহার করে , যেখানে 0 দ্বারা বিভাজনটি সংজ্ঞাযুক্ত। 0/0 NaN এর একটি ভাল সংজ্ঞায়িত ফলাফল দেয় (একটি-সংখ্যা নয়), এবং x 0 0 এর জন্য x / 0 হয় এক্স-এর চিহ্নের উপর নির্ভর করে + ইনফিনিটি বা -অনফিনিটি দেয়।

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

অনেক প্রসেসরের কিছু প্রকারের অন্তর্নির্মিত "বিভাজন" নির্দেশনা রয়েছে, যা প্রসেসরের উপর নির্ভর করে ভিন্ন আচরণ করবে। ইন্টেল 32 বিট এবং 64 বিট প্রসেসরের উপর, যখন আপনি শূন্য দ্বারা ভাগ করার চেষ্টা করবেন তখন "বিভাজন" নির্দেশাবলী আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করবে। অন্যান্য প্রসেসরগুলি অন্যরকম আচরণ করতে পারে।

যদি কোনও সংকলক সনাক্ত করে যে শূন্য দ্বারা বিভাজন ঘটবে যখন আপনি কিছু কোড প্রয়োগ করেন এবং সংকলকটি তার ব্যবহারকারীদের কাছে খুব সুন্দর, এটি সম্ভবত আপনাকে একটি সতর্কতা দেয় এবং একটি অন্তর্নির্মিত "বিভাজন" নির্দেশনা তৈরি করে যাতে আচরণটি হয় একই।


22
"ইন্টেল 32 বিট এবং bit৪ বিট প্রসেসরে, যখন আপনি শূন্য দ্বারা ভাগ করার চেষ্টা করবেন তখন" বিভাজন "নির্দেশাবলী আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করবে" " হদফ ঘ. অ্যাপ্লিকেশনগুলি সম্পর্কে সিপিইউগুলির কোনও ধারণা নেই, তারা নির্দেশাবলী কার্যকর করে এবং (আমরা যদি এমএমইউ অন্তর্ভুক্ত করি) মেমরি অ্যাক্সেস সীমাবদ্ধতা প্রয়োগ করে ( রিং 0 না করে , বা নন-ইন্টেল-এক্স 86 আর্কিটেকচারে সমতুল্য)। নির্দেশনাটি অ্যাপ্লিকেশন বি বা অপারেটিং সিস্টেমের উপাদান সি পরিবর্তে অ্যাপ্লিকেশন এ এর ​​অংশ, সিপিইউয়ের সাথে অপ্রাসঙ্গিক; নির্দেশটি নির্দেশ X হতে পারে বা মেমরি ঠিকানা Y ব্যবহার করতে পারে তা প্রাসঙ্গিক।
একটি সিভিএন

1
@ মাইকেলKjörling মন্তব্য যুক্ত করতে: ওএসের এই প্রয়োগটি (এবং অন্যান্য ধরণের ত্রুটিগুলি) বিজ্ঞপ্তি দেওয়ার উপায় রয়েছে। উইন্ডোজ জগতে এটি হ'ল EXCEPTION_INT_DIVIDE_BY_ZEROমান EXCEPTION_RECORDযা হ'ল ( আশাবাদী ) ইনস্টল করা স্ট্রাক্টেড এক্সসেপশন হ্যান্ডলিং হ্যান্ডলার
ব্যবহারকারী 45891

1
কখনও কখনও তারা আপনার অ্যাপ্লিকেশানটি ক্রাশ হয়ে যাওয়ার নিশ্চয়তা ব্যতীত অন্য কিছু করে। উদাহরণস্বরূপ, অনেক ভাষা / প্ল্যাটফর্ম গ্যারান্টি দেয় যে তারা শূন্য দ্বারা বিভাগে একটি ব্যতিক্রম ছুঁড়ে ফেলবে। তারপরে আপনি ক্র্যাশ না করে বলা ব্যতিক্রমটিকে ধরতে পারবেন এবং পরিচালনা করতে পারবেন।
রিরাব

2
আপনি "অন্য প্রসেসরগুলি অন্যরকম আচরণ করতে পারে" এর মধ্যে "মে" মুছতে পারেন: পাওয়ারপিসি প্ল্যাটফর্মে বিভাগটি শূন্য দ্বারা বিভাগের শূন্য ফলাফল দেয়। যা এক্স 86 প্ল্যাটফর্মের আতঙ্কিত আচরণের চেয়ে অনেক বেশি কার্যকর।
স্নেহশালী

13

দেখে মনে হচ্ছে আপনি ভাবছেন যে কেউ যদি এমন সিপিইউ তৈরি করে যা স্পষ্টভাবে বিভাজনের আগে শূন্যের জন্য পরীক্ষা করে না। কি ঘটবে তা পুরোপুরি বিভাগ বাস্তবায়নের উপর নির্ভর করে। বিশদে না গিয়ে, এক ধরণের বাস্তবায়নের ফলে এমন সমস্ত ফলাফল তৈরি হবে যা সমস্ত বিট সেট করে, যেমন একটি 16-বিট সিপিইউতে 65535। অন্য একটি ঝুলতে পারে।


1

তবে আমি কী ভাবছিলাম যে কম্পিউটারটি যদি শূন্য দ্বারা ভাগ করার চেষ্টা করে, বা এটি কেবল "সুরক্ষায় অন্তর্নির্মিত" থাকে, যাতে এটি 0 দেখায় "0/0" এটি গণনা করার চেষ্টা করার আগেই একটি ত্রুটি ফিরে আসে?

যেহেতু x/0কোনও বুদ্ধি, সময়কাল নেই, কম্পিউটারগুলি সর্বদা শূন্য দ্বারা বিভাগের জন্য চেক করা উচিত। এখানে একটি সমস্যা রয়েছে: প্রোগ্রামাররা (a+b)/cএই গণনাটি এমনকি অর্থবোধ করে কিনা তা পরীক্ষা করে দেখার জন্য বিরক্তি ছাড়াই গণনা করতে চান । সিপিইউ + সংখ্যা টাইপ + অপারেটিং সিস্টেম + ভাষা দ্বারা শূন্য দ্বারা বিভাজনের নীচে-হুড প্রতিক্রিয়া হ'ল হয় কঠোর কিছু করা (উদাহরণস্বরূপ, প্রোগ্রামটি ক্র্যাশ করা) বা অত্যধিক সৌম্যর কিছু করা (যেমন, একটি মান তৈরি করা যা কোনও মান দেয় না বুদ্ধি যেমন আইইইই ভাসমান পয়েন্ট NaN, একটি সংখ্যা যা "নম্বরে নয়")।

একটি সাধারণ সেটিং-এ, একজন প্রোগ্রামার (a+b)/cজ্ঞান লাভ করে কিনা তা আশা করা যায় । এই প্রসঙ্গে, শূন্য দ্বারা বিভাগের জন্য চেক করার কোনও কারণ নেই। যদি শূন্য দ্বারা বিভাজন ঘটে, এবং যদি মেশিন ল্যাঙ্গুয়েজ + বাস্তবায়ন ভাষা + ডেটা টাইপ + অপারেটিং সিস্টেমের প্রতিক্রিয়া এটি প্রোগ্রামটিকে ক্র্যাশ করে তোলে, ঠিক আছে। যদি প্রতিক্রিয়াটি এমন কোনও মান তৈরি করে যা শেষ পর্যন্ত প্রোগ্রামের প্রতিটি সংখ্যা দূষিত করতে পারে তবে তা ঠিক আছে।

উচ্চ নির্ভরযোগ্যতা কম্পিউটিংয়ের জগতে "কঠোর কিছু" বা "অত্যধিক সৌম্য" নয় সঠিক জিনিস do এই ডিফল্ট প্রতিক্রিয়াগুলি হয়ত কোনও রোগীকে মেরে ফেলবে, একজন বিমান দুর্ঘটনা করতে পারে বা বোমা ফাটিয়ে ভুল জায়গায় ফেলতে পারে। উচ্চ নির্ভরযোগ্যতার পরিবেশে, একজন প্রোগ্রামার যিনি লেখেন (a+b)/cতাকে কোড পর্যালোচনা চলাকালীন বা আধুনিক সময়ে, সম্ভবত একটি সরঞ্জাম দ্বারা মৃত্যুর কাছে নিয়ে যাওয়া হবে যা ভার্বোটেন নির্মাণের জন্য পরীক্ষা করে। এই পরিবেশে, সেই প্রোগ্রামারটির পরিবর্তে কিছু কিছু লেখার উচিত ছিল div(add(a,b),c)(এবং সম্ভবত ত্রুটির স্থিতির জন্য কিছু পরীক্ষা করা)। ফণা নীচে, div(এবং এছাড়াও add) ফাংশন / ম্যাক্রোগুলি বিভাগের বিরুদ্ধে শূন্য দ্বারা রক্ষা করে (বা ক্ষেত্রে প্রবাহিত add)। এই সুরক্ষাটি কী কার্যকর করে তা হ'ল অত্যন্ত কার্যকর specific


স্কুলে আপনি যে পাটিগণিত শিখেছিলেন তা এনএএন মানে না বলে এর অর্থ এই নয় যে এটি কোনও অর্থবোধ করে না । এটি বিভিন্ন গাণিতিক মান্য করে
কালেথ

-2

আমরা এখনই জানি x/0এবং এর 0/0সঠিক সংজ্ঞা দেওয়া হয়নি। আপনি 0/0যাইহোক গণনা করার চেষ্টা করলে কি হবে ?

একটি আধুনিক সিস্টেমে, গণনাটি সিপিইউর মধ্যে এমপিইউতে পাস করা হয় এবং ফিরে আসা অবৈধ অপারেশন হিসাবে চিহ্নিত করা হয় NaN

অনেক পুরানো সিস্টেমে যেমন '৮০ এর দশকের হোম কম্পিউটারগুলিতে অন-চিপ বিভাগ ছিল না, গণনাটি সফ্টওয়্যার যা চলছিল তা দিয়েই করা হয়েছিল। কয়েকটি সম্ভাব্য পছন্দ রয়েছে:

  • মান শূন্য না হওয়া অবধি ডিভাইডারের আরও ছোট এবং ছোট কপিগুলি বিয়োগ করুন এবং কোন আকারের অনুলিপিগুলি বিয়োগ করা হয়েছিল তা ট্র্যাক করুন
    • যদি এটি প্রথম বিয়োগের আগে শূন্যের জন্য পরীক্ষা করে, এটি দ্রুত প্রস্থান করবে এবং ফলাফল হবে 0
    • যদি এটি ধরে নেয় তবে এটি অবশ্যই কমপক্ষে একবার বিয়োগ করতে সক্ষম হবে, ফলাফল হবে 1
  • উভয় সংখ্যার লগারিদম গণনা করুন, তাদের বিয়োগ করুন এবং ফলাফলের শক্তিতে বাড়ান । উপরের বিয়োগফলের তুলনায় একটি খুব অযোগ্য পদ্ধতি, তবে গাণিতিকভাবে বৈধ
    • একটি ওভারফ্লো গণনা করার চেষ্টা করে log(0)এবং সফ্টওয়্যারটি এর ত্রুটি হ্যান্ডলিং রুটিনগুলি ব্যবহার করবে বা ক্র্যাশ করবে
    • সফ্টওয়্যারটি ধরে নিতে পারে যে সমস্ত লোগারিদম একটি নির্দিষ্ট সংখ্যক পদক্ষেপে গণনা করা যায় এবং একটি বৃহত্তর, তবে ভুল মানটি ফিরিয়ে আনতে পারে। যেহেতু উভয় লগারিদম একই হবে, তফাতটি হবে 0এবং ই 0 = 1, এর ফলাফল প্রদান করবে1

অন্য কথায়, এটি কী হবে তা বাস্তবায়নের উপর নির্ভরশীল এবং এমন সফ্টওয়্যার লিখতে সম্ভব হবে যা প্রতিটি মানের জন্য সঠিক এবং প্রত্যাশিত ফলাফল তৈরি করে তবে এর জন্য আপাতদৃষ্টিতে অদ্ভুত মানগুলি 0/0তবুও অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ।


3
এই প্রশ্নটি পূর্ণসংখ্যায় শূন্য দ্বারা ভাগ করার বিষয়ে, এবং পূর্ণসংখ্যার মতো কোনও জিনিস নেই NaN
ডেভিড হামেন

3
বিভাগের ফলাফল গণনা করার জন্য কোনও সিপিইউ লগগুলি গণনা এবং বিয়োগ করতে যাচ্ছে না। লোগারিদম নির্দেশের সময়কাল হ'ল ডিভিশনের চেয়ে বেশি মাত্রার কয়েকটি অর্ডার। লগ (0) এর মান কত?
wallyk

1
@ ডেভিডহ্যামেন ওপি কখনও একবার পূর্ণসংখ্যার কথা উল্লেখ করেনি, এবং কেউই এই প্রশ্নে মন্তব্যও করেনি। পূর্ণসংখ্যা কেবল উত্তরে উল্লেখ করা হয়।
সিজে ডেনিস

@ ওয়াল্ক আমি ইতিমধ্যে আমার উত্তরে বলেছি যে লগারিদমগুলি very inefficientবিভাজনের জন্য। পাটিগণিতের জন্য ব্যয় হ'ল (সংযোজন = বিয়োগ) <= গুণ = <বিভাজন। আপনার যদি এমন কোনও এমপিইউ না থাকে যা একই সংখ্যার ক্লক চক্রে সংযোজন হিসাবে (সাধারণত একটি) বিভাগ করতে পারে তবে বিভাগটি সংযোজন এবং বিয়োগের চেয়ে বেশি ব্যয়বহুল এবং সাধারণত গুণনের চেয়েও ব্যয়বহুল।
সিজে ডেনিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.