ব্যতিক্রমগুলি সমর্থন করে না এমন ভাষায় শূন্য দ্বারা বিভাজন কীভাবে পরিচালনা করবেন?


62

কিছু ব্যবসায়ের প্রয়োজনীয়তা সমাধানের জন্য আমি একটি নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ বিকাশের মাঝখানে আছি এবং এই ভাষাটি শিক্ষানবিশ ব্যবহারকারীদের লক্ষ্যবস্তু। সুতরাং ভাষায় ব্যতিক্রম হ্যান্ডলিংয়ের জন্য কোনও সমর্থন নেই এবং আমি এটি যুক্ত করলেও তারা এটি ব্যবহার করবে বলে আমি আশা করব না।

আমি সেই বিন্দুতে পৌঁছেছি যেখানে আমাকে বিভাজন অপারেটরটি বাস্তবায়ন করতে হবে, এবং আমি ভাবছি যে শূন্য ত্রুটির দ্বারা কোনও বিভাজনকে কীভাবে সেরাভাবে পরিচালনা করা যায়?

এই মামলাটি পরিচালনা করার জন্য আমার কাছে কেবল তিনটি সম্ভাব্য উপায় রয়েছে বলে মনে হয়।

  1. ত্রুটি উপেক্ষা করুন এবং 0ফলাফল হিসাবে উত্পাদন করুন। সম্ভব হলে সতর্কতা লগইন করা।
  2. NaNসংখ্যার সম্ভাব্য মান হিসাবে যুক্ত করুন , তবে NaNএটি ভাষার অন্যান্য ক্ষেত্রে কীভাবে মানগুলি পরিচালনা করতে পারে সে সম্পর্কে প্রশ্ন উত্থাপন করে।
  3. প্রোগ্রামটির সম্পাদন বন্ধ করুন এবং ব্যবহারকারীকে রিপোর্ট করুন যাতে একটি গুরুতর ত্রুটি ঘটেছে।

বিকল্প # 1 একমাত্র যুক্তিসঙ্গত সমাধান বলে মনে হচ্ছে। # 3 বিকল্পটি ব্যবহারিক নয় কারণ এই ভাষাটি রাতের ক্রোন হিসাবে যুক্তি চালাতে ব্যবহৃত হবে।

শূন্য ত্রুটি দ্বারা বিভাজন পরিচালনার জন্য আমার বিকল্পগুলি কী এবং # 1 বিকল্পের সাথে ঝুঁকিগুলি কী।


12
যদি আপনি ব্যতিক্রম সমর্থন যোগ করেন এবং ব্যবহারকারী এটি না ধরেন তবে আপনার কাছে বিকল্প # 3 থাকবে
রাচেট ফ্রিক

82
আমি কৌতূহলী, কোন ধরণের বোকা প্রয়োজনটির জন্য আপনাকে পুরো নতুন প্রোগ্রামিং ভাষা তৈরি করতে হবে? আমার অভিজ্ঞতা, কখনও তৈরি প্রতিটি ভাষায় sucks (নকশা অথবা সম্পাদনের প্রায়ই উভয়) এবং এটা এমনকি পেতে অযৌক্তিকভাবে অনেক প্রচেষ্টা গ্রহণ করে অনেক। প্রথমটিতে কিছু ব্যতিক্রম রয়েছে, তবে দ্বিতীয়টি নয়, এবং তারা সহজেই <0.01% ক্ষেত্রে হওয়ায় তারা সম্ভবত পরিমাপের ত্রুটি ;-)

16
@ ডেলান বেশিরভাগ নতুন ভাষাগুলি তৈরি করা হয় যাতে ব্যবসায়ের নিয়মগুলি কীভাবে প্রয়োগ করা হয় সেগুলি থেকে আলাদা করা যায়। ব্যবহারকারীর কীভাবে reject "Foo"প্রয়োগ করা হয়েছিল তা জানার দরকার নেই , তবে কীওয়ার্ডটি থাকলে এটি কোনও দস্তাবেজকে প্রত্যাখ্যান করে Foo। আমি ব্যবহারকারীদের সাথে পরিচিত পদগুলি ব্যবহার করে ভাষাটি যত সহজে পড়তে পারি তা চেষ্টা করার চেষ্টা করি। কোনও ব্যবহারকারীকে তাদের নিজস্ব প্রোগ্রামিং ভাষা প্রদান তাদের প্রযুক্তিগত কর্মীদের উপর নির্ভর করে ব্যবসায়ের নিয়ম যুক্ত করার ক্ষমতা দেয় add
18-15

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

16
আমি মালিকানাধীন, ট্যুরিং-সম্পূর্ণ প্রোগ্রামিং ভাষার ন্যায্যতা অর্জনের জন্য যথেষ্ট পর্যাপ্ত একটি ব্যবসায়িক ডোমেন কমপ্লেক্স দ্বারা মুগ্ধ এবং মুগ্ধ হয়েছি তবে মারাত্মকভাবে ভুল ফলাফল সহ্য করার পক্ষে যথেষ্ট x
মার্ক ই। হাজেস

উত্তর:


98

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

এছাড়াও, আপনি এই প্যাটার্নটি পুঙ্খানুপুঙ্খভাবে অনুসরণ করে সফল হতে পারবেন। যত তাড়াতাড়ি বা পরে আপনি ত্রুটিযুক্ত পরিস্থিতিতে দৌড়াবেন যা কেবল উপেক্ষা করা যায় না (যেমন স্মৃতিশক্তি শেষ হয়ে যাওয়া বা স্ট্যাক ওভারফ্লো) এবং আপনাকে যেভাবেই হোক প্রোগ্রামটি শেষ করার কোনও উপায় বাস্তবায়ন করতে হবে।

অপশন # 2 (এনএএন ব্যবহার করে) কিছুটা কাজ হবে তবে আপনি যা ভাবেন ততটা নয়। আইএনইই 754 স্ট্যান্ডার্ডে কীভাবে বিভিন্ন গণনায় NaN হ্যান্ডেল করা যায় তা সঠিকভাবে নথিবদ্ধ থাকে, সুতরাং আপনি সম্ভবত আপনার দোভাষীর লেখা ভাষায় যা করতে পারেন তা করতে পারেন।

উপায় দ্বারা: নন-প্রোগ্রামারগণের দ্বারা ব্যবহারযোগ্য একটি প্রোগ্রামিং ভাষা তৈরি করা আমরা 1964 সাল থেকে চেষ্টা করার চেষ্টা করে যাচ্ছি (ডার্টমাউথ বেসিক)। এখনও অবধি আমরা ব্যর্থ হয়েছি। তবে যাই হোক শুভকামনা।


14
+1 ধন্যবাদ আপনি আমাকে একটি ত্রুটি নিক্ষেপ করতে রাজি করেছিলেন, এবং এখন আমি আপনার উত্তরটি পড়েছি কেন আমি দ্বিধা বোধ করছি তা বুঝতে পারছি না। PHPআমার উপর খারাপ প্রভাব ফেলেছে
বিক্রিয়

24
হ্যাঁ এটা আছে. আমি যখন আপনার প্রশ্নটি পড়েছি তখনই আমি ততক্ষণে ভেবেছিলাম যে ভুল আউটপুট তৈরি করা এবং ত্রুটির মুখে ট্র্যাকিং চালিয়ে যাওয়া খুব পিএইচপি-এস্কু জিনিস। পিএইচপি হ'ল এটি করার ব্যতিক্রম কেন এমন ভাল কারণ রয়েছে।
জোয়েল

4
বেসিক মন্তব্যের জন্য +1। আমি NaNকোনও শিক্ষানবিশের ভাষায় ব্যবহার করার পরামর্শ দিচ্ছি না , তবে সাধারণভাবে, দুর্দান্ত উত্তর।
রস প্যাটারসন

8
@ জোয়েল যদি তিনি দীর্ঘকাল বেঁচে থাকতেন তবে ডিজকস্ট্রা সম্ভবত বলে দিতেন "[পিএইচপি] এর ব্যবহার মনকে পঙ্গু করে তোলে; সুতরাং এর শিক্ষাকে ফৌজদারি অপরাধ হিসাবে গণ্য করা উচিত।"
রস প্যাটারসন

12
@Ross। "কম্পিউটার বিজ্ঞানের

33

1 - ত্রুটি উপেক্ষা করুন এবং 0ফলাফল হিসাবে উত্পাদন করুন। সম্ভব হলে সতর্কতা লগইন করা।

এটি একটি ভাল ধারণা নয়। মোটেই লোকেরা এর উপর নির্ভর করে শুরু করবে এবং আপনার যদি কখনও এটিকে ঠিক করা হয় তবে আপনি প্রচুর কোড ভঙ্গ করবেন।

2 - NaNসংখ্যার সম্ভাব্য মান হিসাবে যুক্ত করুন , তবে NaNএটি ভাষার অন্যান্য ক্ষেত্রে কীভাবে মানগুলি পরিচালনা করতে পারে সে সম্পর্কে প্রশ্ন উত্থাপন করে।

অন্যান্য ভাষাগুলির রানটাইমগুলি যেভাবে এটি আপনাকে এনএএন হ্যান্ডেল করা উচিত: পরবর্তী কোনও গণনাও NaN দেয় এবং প্রতিটি তুলনা (এমনকি NaN == NaN) মিথ্যাও দেয়।

আমি মনে করি এটি গ্রহণযোগ্য, তবে অগত্যা নতুন আগমনকারী বান্ধব নয়।

3 - প্রোগ্রামটির সম্পাদন বন্ধ করুন এবং ব্যবহারকারীকে একটি গুরুতর ত্রুটি ঘটেছে প্রতিবেদন করুন।

এটি আমার মনে হয় সেরা সমাধান। সেই তথ্য হাতে ব্যবহারকারীদের 0 টি পরিচালনা করতে সক্ষম হওয়া উচিত You আপনার একটি পরীক্ষার পরিবেশ সরবরাহ করা উচিত, বিশেষত যদি এটি রাতে একবার চালানোর উদ্দেশ্যে থাকে।

একটি চতুর্থ বিকল্প আছে। বিভাগকে একটি টার্নারি অপারেশন করুন। এই দুজনের যে কোনও একটিই কাজ করবে:

  • বিভাগ (সংখ্যা, সংখ্যক, বিকল্প_ ফলাফল)
  • বিভাগ (সংখ্যা, সংখ্যক, বিকল্প_সংখ্যা)

কিন্তু আপনি যদি নিশ্চিত করতে NaN == NaNহবে false, তারপর আপনি একটি যোগ করতে হবে isNaN()ফাংশন যাতে ব্যবহারকারীরা সনাক্ত করতে সক্ষম হয় NaNসে।
এজেম্যানসফিল্ড

2
@AJMansfield: উভয় ক্ষেত্রেই, অথবা মানুষ এটা নিজেদের বাস্তবায়ন: isNan(x) => x != x। তবুও, আপনি যখন NaNআপনার প্রোগ্রামিং কোডটি নিয়ে আসছেন, আপনার isNaNচেক যোগ করা শুরু করা উচিত নয় , বরং কারণটি সন্ধান করা উচিত এবং সেখানে প্রয়োজনীয় চেকগুলি করা উচিত। সুতরাং এটি NaNসম্পূর্ণরূপে প্রচার করা গুরুত্বপূর্ণ ।
back2dos

5
NaNগুলি প্রধানত পাল্টা স্বজ্ঞাত। একটি শিক্ষানবিশ ভাষায়, তারা আগমনে মারা গেছে।
রস প্যাটারসন

2
@ রোসপ্যাটারসন তবে একটি শিক্ষানবিস সহজেই বলতে পারেন 1/0- আপনাকে এটির সাথে কিছু করতে হবে। Infবা ব্যতীত অন্য কোনও কার্যকর ফলাফল নেই NaN- যা ত্রুটিটিকে প্রোগ্রামে আরও ছড়িয়ে দেবে। অন্যথায় একমাত্র সমাধান হ'ল এই মুহুর্তে একটি ত্রুটি সহ বন্ধ করা।
মার্ক হারড

1
ফাংশনটির অনুরোধের মাধ্যমে বিকল্প 4 এর উন্নতি করা যেতে পারে, যা অপ্রত্যাশিত 0 বিভাজক থেকে পুনরুদ্ধার করার জন্য প্রয়োজনীয় পদক্ষেপটি সম্পাদন করতে পারে।
সাইবারফোনিক

21

চরম কুসংস্কারের সাথে চলমান অ্যাপ্লিকেশনটি সমাপ্ত করুন। (পর্যাপ্ত ডিবাগ তথ্য সরবরাহ করার সময়)

তারপরে আপনার ব্যবহারকারীদের এমন শর্তগুলি শনাক্ত করতে এবং পরিচালনা করতে হবে যেখানে বিভাজক শূন্য হতে পারে (ব্যবহারকারী প্রবেশমূল্যগুলি ইত্যাদি))


13

Haskell, (এবং Scala মধ্যে অনুরূপ), পরিবর্তে ব্যতিক্রম নিক্ষেপ (অথবা নাল রেফারেন্স ফেরত) মোড়কের ধরনের Maybeএবং Eitherব্যবহার করা যাবে। সঙ্গে Maybeযদি মান তিনি পেয়েছেন "খালি" হয় ব্যবহারকারী পরীক্ষা করার জন্য একটি সুযোগ রয়েছে, না সে ডিফল্ট মান যখন "unwrapping" প্রদান করতে পারে। Eitherঅনুরূপ, তবে ব্যবহার করা যেতে পারে কোনও বস্তু (যেমন একটি ত্রুটিযুক্ত স্ট্রিং) প্রদান করে যদি সমস্যা থাকে তবে এটি একটি রয়েছে।


1
সত্য, তবে মনে রাখবেন যে হাস্কেল এটিকে শূন্য দ্বারা ভাগ করার জন্য ব্যবহার করে না। পরিবর্তে, প্রতিটি হাস্কেল প্রকারের স্পষ্টভাবে একটি সম্ভাব্য মান হিসাবে "নীচে" থাকে। এটি এই অর্থে নাল পয়েন্টারগুলির মতো নয় যে এটি একটি অভিব্যক্তির "মান" যা শেষ করতে ব্যর্থ হয়। আপনি নিরঙ্কুণের জন্য মান হিসাবে অবশ্যই পরীক্ষা করতে পারবেন না, তবে অপারেশনাল শব্দার্থক ক্ষেত্রে যে মামলাগুলি শেষ করতে ব্যর্থ হয় সেগুলি একটি অভিব্যক্তির অর্থের অংশ। হাস্কেল-এ, "নীচে" মানটি অতিরিক্ত ত্রুটি-কেস ফলাফলগুলি পরিচালনা করে যেমন error "some message"ফাংশনটি মূল্যায়ন করা হচ্ছে।
স্টিভ 314

ব্যক্তিগতভাবে, যদি পুরো প্রোগ্রামটি বাতিল করার প্রভাবটি বৈধ হিসাবে বিবেচিত হয় তবে আমি জানি না কেন খাঁটি কোডটিতে কোনও ব্যতিক্রম ছোঁড়ার প্রভাব থাকতে পারে না, তবে এটি কেবল আমার - Haskellখাঁটি অভিব্যক্তি ব্যতিক্রম ছোঁড়াতে দেয় না।
স্টিভ 314

আমি মনে করি এটি একটি ভাল ধারণা কারণ একটি ব্যতিক্রম ছোঁড়া ছাড়া, প্রস্তাবিত সমস্ত বিকল্প ব্যবহারকারীদের সাথে যোগাযোগ করে না যে তারা ভুল করেছে a মূল ধারণাটি হ'ল ব্যবহারকারীরা প্রোগ্রামটিকে যে মূল্য দিয়েছিলেন তা দিয়ে ভুল করে, তাই প্রোগ্রামটিকে ব্যবহারকারীকে বলতে হবে যে তারা ভুল ইনপুট দিয়েছে (তারপরে ব্যবহারকারী প্রতিকারের কোনও উপায় চিন্তা করতে পারে)। ব্যবহারকারীদের তাদের ভুল সম্পর্কে কিছু না জানিয়ে যে কোনও সমাধান তাই বিশ্রী মনে হয় feels
InformedA

আমি মনে করি এটিই যাওয়ার উপায় ... মরিচা প্রোগ্রামিং ভাষা এটির স্ট্যান্ডার্ড লাইব্রেরিতে এটি ব্যাপকভাবে ব্যবহার করে।
আওচাগিয়া

12

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

x = ...
y = ...

if y ≠ 0:
  return x / y    // In this block, y is known to be nonzero.
else:
  return x / y    // This, however, is a compile-time error.

বিকল্পভাবে, একটি বুদ্ধিমান দৃsert় ফাংশন রাখুন যা আক্রমণকারীদের প্রতিষ্ঠা করে:

x = ...
require x ≠ 0, "Unexpected zero in calculation"
// For the remainder of this scope, x is known to be nonzero.

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

x = ...           // env1 = { x :: int }
y = ...           // env2 = env1 + { y :: int }
if y ≠ 0:         // env3 = env2 + { y ≠ 0 }
  return x / y    // (/) :: (int, int ≠ 0) → int
else:             // env4 = env2 + { y = 0 }
  ...
...               // env5 = env2

তদ্ব্যতীত, এটি nullআপনার ভাষাতে যদি এমন বৈশিষ্ট্যগুলি থাকে তবে এটি স্বাভাবিকভাবে পরিসীমা এবং যাচাইয়ের ক্ষেত্রে প্রসারিত ।


4
ঝরঝরে ধারণা, তবে এই ধরণের সীমাবদ্ধতা সমাধান হ'ল এনপি-সম্পূর্ণ। এরকম কিছু ভাবুন def foo(a,b): return a / ord(sha1(b)[0])। স্থিতিশীল বিশ্লেষক SHA-1 উল্টাতে পারে না। কলংয়ের এই ধরণের স্থির বিশ্লেষণ রয়েছে এবং অগভীর ত্রুটিগুলি খুঁজে পাওয়ার জন্য এটি দুর্দান্ত তবে এটি পরিচালনা করতে পারে না এমন প্রচুর পরিমাণে রয়েছে।
মার্ক ই। হাজেস

9
এটি এনপি-সম্পূর্ণ নয়, এটি অসম্ভব - থামছে লেমাকে। তবে স্থির বিশ্লেষককে এটি সমাধান করার দরকার নেই, এটি কেবল এই জাতীয় বিবৃতিটি ফাঁদে ফেলতে পারে এবং আপনাকে একটি স্পষ্ট বক্তব্য বা সজ্জা যুক্ত করতে হবে।
MK01

1
@ এমকে01: অন্য কথায়, বিশ্লেষণটি "রক্ষণশীল"।
জন পূর্ব

11

নম্বর 1 (অবর্ণনযোগ্য শূন্য inোকান) সর্বদা খারাপ। # 2 (এনএএন প্রচার করুন) এবং # 3 (প্রক্রিয়াটি মেরে ফেলুন) এর মধ্যে পছন্দটি প্রসঙ্গের উপর নির্ভর করে এবং আদর্শভাবে এটি একটি বিশ্বব্যাপী সেটিংস হওয়া উচিত, যেমনটি নম্পি রয়েছে।

আপনি যদি একটি বড়, সমন্বিত গণনা করছেন, NaN প্রচার করা একটি খারাপ ধারণা কারণ এটি শেষ পর্যন্ত আপনার পুরো গণনাটি ছড়িয়ে দেবে এবং সংক্রামিত হবে --- যখন আপনি সকালে ফলাফলগুলি দেখেন এবং দেখবেন যে তারা সমস্ত এনএন, আপনি ' d ফলাফলগুলি ফেলে দিতে হবে এবং যাইহোক আবার শুরু করতে হবে। প্রোগ্রামটি বন্ধ হয়ে গেলে আরও ভাল হত, আপনি মাঝরাতে একটি কল পেয়ে ঠিক করেছেন --- কমপক্ষে নষ্ট হওয়া ঘন্টার সংখ্যার দিক থেকে।

যদি আপনি অনেকগুলি সামান্য, বেশিরভাগ-স্বতন্ত্র গণনা করে থাকেন (যেমন মানচিত্র-হ্রাস বা বিব্রতকরভাবে সমান্তরাল গণনা), এবং আপনি তাদের কিছু শতাংশ NaN- এর কারণে অকেজো হয়ে পড়তে সহ্য করতে পারেন তবে এটি সম্ভবত সেরা বিকল্প। প্রোগ্রামটি সমাপ্ত করা এবং 99% যা না করা ভাল এবং দরকারী যে 1% যা ত্রুটিযুক্ত এবং শূন্য দ্বারা ভাগ করে দেওয়া হয়েছে তার কারণ হিসাবে না করা একটি ভুল হতে পারে।

NaNs সম্পর্কিত আরও একটি বিকল্প: একই আইইইই ভাসমান-পয়েন্ট স্পেসিফিকেশন ইনফ এবং -আইএনএফ সংজ্ঞায়িত করে এবং এগুলি NaN এর চেয়ে আলাদাভাবে প্রচারিত হয়। উদাহরণস্বরূপ, আমি পুরোপুরি নিশ্চিত যে ইনফ> যে কোনও সংখ্যা এবং -আইএনএফ <যে কোনও সংখ্যক, আপনি যদি শূন্য দ্বারা আপনার বিভাগটি ঘটে তবে আপনি যা চেয়েছিলেন তা হ'ল কারণ শূন্যটি কেবল একটি ছোট সংখ্যার হিসাবে অনুমিত ছিল। যদি আপনার ইনপুটগুলি বৃত্তাকার হয়ে থাকে এবং পরিমাপের ত্রুটিতে ভুগে থাকে (যেমন হাতে নেওয়া শারীরিক পরিমাপ) তবে দুটি বড় পরিমাণের পার্থক্যের ফলে শূন্য হতে পারে। শূন্য বিভাজন না করে আপনি কিছুটা বড় সংখ্যা অর্জন করতে পারতেন, এবং সম্ভবত আপনি এটি কতটা বড় তা যত্নশীল হন না। সেক্ষেত্রে ইন এবং -আইএনএফ পারফেক্টলি বৈধ ফলাফল।

এটিও আনুষ্ঠানিকভাবে সঠিক হতে পারে --- শুধু বলুন আপনি বর্ধিত রাজ্যে কাজ করছেন।


তবে আমরা বলতে পারি না যে ডিনোনিটারটি ইতিবাচক বা নেতিবাচক হওয়ার উদ্দেশ্যে করা হয়েছিল, সুতরাং -ইনফ যখন ইচ্ছা হয়েছিল তখন বিভাজন বা ইনফরমেশন বিপরীত হতে পারে।
ড্যানিয়েল লুবারভ

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

আপনি যদি এই ধরণের সিস্টেমে কাজ করে থাকেন তবে আপনাকে + ইনফ এবং ইনফ সমতুল্য হিসাবে চিহ্নিত করতে হবে ঠিক যেমন আপনাকে +0 এবং -0 সমতুল্য হিসাবে সনাক্ত করতে হবে, যদিও তাদের বিভিন্ন বাইনারি উপস্থাপনা রয়েছে।
জিম পিভারস্কি

8

৩. প্রোগ্রামটির সম্পাদন বন্ধ করুন এবং ব্যবহারকারীকে রিপোর্ট করুন যাতে একটি গুরুতর ত্রুটি ঘটেছে।

[এই বিকল্পটি] ব্যবহারিক নয় ...

অবশ্যই এটি ব্যবহারিক: এটি প্রোগ্রামারদের দায়িত্ব যে কোনও প্রোগ্রাম লিখতে হবে যা আসলে উপলব্ধি করে। 0 দ্বারা ভাগ করা কোনও অর্থবোধ করে না। সুতরাং, যদি প্রোগ্রামার একটি বিভাগ পরিচালনা করে থাকে তবে বিভাজক 0 টির সমান নয় বলে আগেই যাচাই করাও তার / তার দায়িত্ব। সম্ভব, এবং অস্বীকৃত (NaN) বা ভুল (0) গণনার ফলাফলগুলি কেবল সেই সম্মানে সহায়তা করবে না।

অপশন 3টি হ'ল আমি আপনাকে সুপারিশ করব, বিটিডাব্লু, সর্বাধিক সরল, সৎ এবং গাণিতিকভাবে সঠিক হওয়ার জন্য।


4

এমন পরিবেশে ত্রুটি উপেক্ষা করা এমন গুরুত্বপূর্ণ পরিস্থিতিতে (যেমন; "নাইট ক্রোন") চালানো আমার কাছে খারাপ ধারণা বলে মনে হচ্ছে। এটিকে বৈশিষ্ট্যযুক্ত করা একটি ভয়ানক ধারণা। এটি 1 এবং 2 বিকল্পগুলি বাতিল করে।

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


3

আইইইই 754 এর প্রকৃতপক্ষে আপনার সমস্যার সমাধানের জন্য একটি সমাধান রয়েছে। Http://en.wikedia.org/wiki/IEEE_floating_Point#Exception_handling ব্যবহার না করে ব্যতিক্রম হ্যান্ডলিংexceptions

1/0  = Inf
-1/0 = -Inf
0/0  = NaN

এইভাবে আপনার সমস্ত ক্রিয়াকলাপগুলি গাণিতিক অর্থে তৈরি হয়।

\ lim_ {x \ থেকে 0} 1 / x = ইনফ

আমার মতে আইইইই 754 অনুসরণ করা সবচেয়ে বেশি অর্থবোধ করে কারণ এটি নিশ্চিত করে যে আপনার গণনাগুলি কম্পিউটারে যেমন চলছে ঠিক ততই সঠিক এবং আপনি অন্যান্য প্রোগ্রামিং ভাষার আচরণের সাথেও সামঞ্জস্যপূর্ণ।

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

julia> 1/0
Inf

julia> -1/0
-Inf

julia> 0/0
NaN

julia> a = [1,1,1] ./ [2,1,0]
3-element Array{Float64,1}:
   0.5
   1.0
 Inf

julia> sum(a)
Inf

julia> a = [1,1,0] ./ [2,1,0]
3-element Array{Float64,1}:
   0.5
   1.0
 NaN

julia> sum(a)
NaN

বিভাজন ত্রুটিটি গাণিতিক ক্রিয়াকলাপগুলির মাধ্যমে সঠিকভাবে প্রচারিত হয় তবে শেষে ব্যবহারকারী ত্রুটিটি কোন অপারেশন থেকে শুরু করে তা অগত্যা জানে না।

edit:আমি জিম পিভারস্কির উত্তরের দ্বিতীয় অংশটি দেখতে পাই নি যা মূলত আমি উপরে বলছি। আমার খারাপ।


2

এসকিউএল, সহজে প্রোগ্রাম বহনবিহীনদের দ্বারা সর্বাধিক বহুল ব্যবহৃত ভাষা # 3 করে, তার পক্ষে মূল্যবান। আমার অভিজ্ঞতার মধ্যে এসকিউএল লেখার জন্য নন-প্রোগ্রামারদের পর্যবেক্ষণ এবং সহায়তা করার ক্ষেত্রে, এই আচরণটি সাধারণত ভালভাবে বোঝা যায় এবং সহজেই ক্ষতিপূরণ হয় (কেস স্টেটমেন্ট বা এর মতো)। এটি আপনাকে সহায়তা করে যে ত্রুটি বার্তাটি আপনাকে সরাসরি সরাসরি বলে মনে করে Post পোস্টগ্রিস 9-এ আপনি "ত্রুটি: শূন্য দ্বারা বিভাগ" পান।


2

আমি মনে করি সমস্যাটি "নবাগত ব্যবহারকারীদের লক্ষ্যবস্তু। -> সুতরাং এর পক্ষে কোনও সমর্থন নেই ..."

আপনি কেন ভাবছেন যে ব্যতিক্রম হ্যান্ডলিং নবজাতী ব্যবহারকারীদের জন্য সমস্যাযুক্ত?

মন্দটা কি? একটি "কঠিন" বৈশিষ্ট্য রয়েছে বা কেন কিছু ঘটেছিল তা জানেন না? আর কি বিভ্রান্ত হতে পারে? একটি কোর ডাম্প বা "মারাত্মক ত্রুটি: শূন্য দ্বারা ভাগ করুন" সহ একটি ক্র্যাশ?

পরিবর্তে, আমি মনে করি গ্রেট বার্তা ত্রুটির জন্য লক্ষ্য করা আরও বেশি ভাল। সুতরাং পরিবর্তে কি: ", খারাপ হিসাব ভাগ 0/0" (অর্থাত: সর্বদা এমন ডেটা রয়েছে যা সমস্যা, শুধু কারণ দেন ধরনের সমস্যা)। PostgreSQL কীভাবে বার্তা ত্রুটি করে তা দেখুন, এটি দুর্দান্ত আইএমএইচও।

তবে আপনি যেমন ব্যতিক্রমগুলি নিয়ে কাজ করার অন্যান্য উপায়গুলি দেখতে পারেন:

http://dlang.org/exception-safe.html

আমি একটি ভাষা তৈরির স্বপ্নও দেখি এবং এই ক্ষেত্রে আমি মনে করি যে সাধারণ ব্যতিক্রমগুলির সাথে একটি মেইন / ptionচ্ছিক মিশ্রণ সেরা হতে পারে:

def openFile(fileName): File | Exception
    if not(File.Exist(fileName)):
        raise FileNotExist(fileName)
    else:
        return File.Open()

#This cause a exception:

theFile = openFile('not exist')

# But this, not:

theFile | err = openFile('not exist')

1

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

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

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

[উদাহরণস্বরূপ, একটি এক্সেল স্প্রেডশিট বিবেচনা করুন। এক্সেল আপনার স্প্রেডশিটটি শেষ করে না কারণ কোনও সংখ্যা উপচে পড়েছে বা যাই হোক না কেন। কক্ষটি একটি অদ্ভুত মান পেয়েছে এবং আপনি এটি খুঁজে বের করে কেন এটি ঠিক করুন]]

সুতরাং আপনার প্রশ্নের উত্তর দিতে: আপনার অবশ্যই শেষ হওয়া উচিত নয়। আপনি NaN প্রতিস্থাপন করতে পারেন তবে আপনার এটি দৃশ্যমান করা উচিত নয়, কেবল নিশ্চিত করুন গণনাটি একটি অদ্ভুত উচ্চ মানের তৈরি করেছে rates এবং একটি ত্রুটি পতাকা সেট করুন যাতে ব্যবহারকারীদের এটির প্রয়োজন হয় তা নির্ধারণ করতে পারে যে কোনও ত্রুটি ঘটেছে।

প্রকাশ: আমি ঠিক এরকম একটি ভাষা বাস্তবায়ন (পাওয়ারফ্লেক্স) তৈরি করেছি এবং 1980 এর দশকে ঠিক এই সমস্যাটি (এবং আরও অনেকে) মোকাবিলা করেছি। গত 20 বা ততোধিক বছরগুলিতে নন-প্রোগ্রামারদের জন্য ভাষা নিয়ে খুব কম বা কোনও অগ্রগতি হয়নি এবং আপনি চেষ্টা করার জন্য সমালোচনার স্তূপ আকৃষ্ট করবেন তবে আমি সত্যিই আশা করি আপনি সফল হয়েছেন।


1

আমি টার্নারি অপারেটরটি পছন্দ করেছি যেখানে আপনি সংখ্যার 0 হলে একটি বিকল্প মান সরবরাহ করেন।

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

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


1

শূন্য দ্বারা বিভাজনের জন্য দুটি মূল কারণ রয়েছে।

  1. একটি সুনির্দিষ্ট মডেলটিতে (পূর্ণসংখ্যার মতো), আপনি শূন্য ডিবিজেড দ্বারা বিভাজন পাবেন কারণ ইনপুটটি ভুল। এটি এমনই ডিবিজেড যা আমাদের বেশিরভাগেরই মনে হয়।
  2. অ-নির্ভুল মডেলটিতে (ভাসমান পিটি-র মতো) ইনপুটটি বৈধ হওয়া সত্ত্বেও আপনি রাউন্ডিং-ত্রুটির কারণে একটি ডিবিজেড পেতে পারেন। এটি আমরা সাধারণত ভাবি না।

১. এর জন্য আপনাকে ব্যবহারকারীদের কাছে আবার যোগাযোগ করতে হবে যে তারা একটি ভুল করেছে কারণ তারা তারাই দায়বদ্ধ এবং পরিস্থিতি কীভাবে প্রতিকার করা যায় তারাই তারাই সেরা জানেন।

২. এটি ব্যবহারকারীর দোষ নয়, আপনি অ্যালগরিদম, হার্ডওয়্যার বাস্তবায়ন ইত্যাদির দিকে আঙুল তুলতে পারেন তবে এটি ব্যবহারকারীর দোষ নয় সুতরাং আপনার প্রোগ্রামটি শেষ করা বা ব্যতিক্রম ছোঁড়া উচিত নয় (যদি অনুমোদিত হয় যা এই ক্ষেত্রে নেই)। সুতরাং একটি যুক্তিসঙ্গত সমাধান হ'ল কিছু যুক্তিসঙ্গত পদ্ধতিতে কার্যক্রম চালিয়ে যাওয়া।

এই প্রশ্নটি করা ব্যক্তিটিকে আমি কেস ১ জিজ্ঞাসা করতে দেখছি তাই আপনাকে ব্যবহারকারীর সাথে যোগাযোগ করতে হবে communicate ফ্লোটিং পয়েন্ট স্ট্যান্ডার্ড, ইনফ, -আইএনএফ, নান, আইইইই এই পরিস্থিতিতে ফিট করে না। মূলত ভুল কৌশল।


0

ভাষায় এটিকে অস্বীকার করুন। এর অর্থ হল, কোনও সংখ্যার দ্বারা বিভাজনকে অস্বীকার করুন যতক্ষণ না এটি সম্ভবত শূন্য হয় না, সাধারণত প্রথমে এটি পরীক্ষা করে। অর্থাৎ।

int div = random(0,100);
int b = 10000 / div; // Error E0000: div might be zero

এটি করার জন্য আপনার পূর্ণসংখ্যার বিপরীতে একটি নতুন সংখ্যার প্রকার, একটি প্রাকৃতিক সংখ্যা প্রয়োজন। সমস্যা হতে পারে ... মোকাবেলা করা।
পরিবেশন করুন

@ সার্ভি: না, আপনি তা করবেন না। আপনি কেন হবে? সম্ভাব্য মানগুলি নির্ধারণ করতে আপনার সংকলকটিতে যুক্তি প্রয়োজন, তবে আপনি যেভাবেই চান (অনুকূলিত কারণে)।
এমসাল্টাররা

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

@ সার্ভে: আপনি ভুল করেছেন: একটি সংকলক এই ধরণের প্রয়োজন ছাড়াই সেই রাজ্যটিকে ট্র্যাক করতে পারে এবং উদাহরণস্বরূপ, জিসিসি ইতিমধ্যে এটি করেছে। উদাহরণস্বরূপ সি টাইপ intশূন্য মানগুলিকে অনুমতি দেয় তবে জিসিসি এখনও নির্ধারণ করতে পারে যে কোডটিতে নির্দিষ্ট ইনটগুলি শূন্য হতে পারে না।
MSalters

2
তবে শুধুমাত্র নির্দিষ্ট কিছু ক্ষেত্রে; এটি 100% নির্ভুলতার সাথে, সমস্ত ক্ষেত্রেই এটি করতে পারে না। আপনার হয় হয় মিথ্যা ধনাত্মক বা মিথ্যা নেতিবাচক। এটি সম্ভবত সত্য। উদাহরণস্বরূপ, আমি কোডের একটি স্নিপেট তৈরি করতে পারি যা সম্পূর্ণ বা নাও পারে । যদি সংকলকটি এটি সমাপ্ত হয় কিনা তাও জানতে না পারে, তবে ফলাফল কী শূন্য নয় তা এটি কীভাবে জানতে পারে? এটি সাধারণ স্পষ্ট কেসগুলি ধরতে পারে তবে সমস্ত ক্ষেত্রে তা নয়
পরিবেশন করুন

0

আপনি যখন কোনও প্রোগ্রামিংয়ের ভাষা লেখেন, আপনার অবশ্যই এই সুযোগটি গ্রহণ করা উচিত এবং শূন্য অবস্থার ভিত্তিতে কোনও পদক্ষেপ অন্তর্ভুক্ত করা বাধ্যতামূলক করা উচিত। a <= n / c: 0 ডিভ বাই বাই শূন্য-ক্রিয়া

আমি জানি যে আমি সবেমাত্র পরামর্শ দিয়েছি তা হল আপনার পিএল এ মূলত একটি 'গোটো' যুক্ত করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.