কোনও লুপের জন্য যেমন পূর্ণসংখ্যা ব্যবহার করার সময় <= এবং> = এড়ানো উচিত? [বন্ধ]


15

আমি আমার শিক্ষার্থীদের বুঝিয়েছি যে সমান-সমীক্ষাটি ভাসমান ভেরিয়েবলের জন্য নির্ভরযোগ্য নয়, তবে পূর্ণসংখ্যার জন্য এটি ঠিক। আমি যে পাঠ্যপুস্তকটি ব্যবহার করছি তা বলেছে যে> এবং <থেকে> = এবং <= পড়া সহজ। আমি কিছুটা হলেও একমত, তবে একটি লুপের জন্য? এটি কি স্পষ্ট নয় যে লুপটি শুরু এবং শেষের মানগুলি নির্দিষ্ট করে?

আমি কি এমন কিছু মিস করছি যা পাঠ্যপুস্তকের লেখক সম্পর্কে সঠিক?

আর একটি উদাহরণ রেঞ্জ পরীক্ষার মধ্যে রয়েছে:

যদি স্কোর> 89 গ্রেড = 'এ'
অন্যথায় স্কোর> 79 গ্রেড = 'বি' ...

কেন শুধু বলছেন না: যদি স্কোর> = 90?

loops 

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

1
এটা কোন ব্যাপার না। সত্যিই।
আউবারন

4
আসলে, এটি উদ্দেশ্যমূলকভাবে জবাবদিহি করা যায়। পাশে দাঁড়াও ...
রবার্ট হার্ভে

9
@ Ixrec আমি সর্বদা এটি আকর্ষণীয় মনে করি যে "সেরা অনুশীলন" একটি উপযুক্ত বিষয় হিসাবে বিবেচিত হয় না। কে তাদের কোডগুলি আরও বেশি পঠনযোগ্য বা উন্নত করতে চায় না? লোকেরা যদি মতানৈক্য হয়, আমরা সকলেই ইস্যুটির আরও দিকগুলি শিখি, এবং ... এমনকি ... আমাদের মনের পরিবর্তনও করে! উঃ, তা বলা এত শক্ত ছিল। রবার্ট হার্ভে বলেছেন যে তিনি এর সদর্থক উত্তর দিতে পারেন। এটি আকর্ষণীয় হবে।

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

উত্তর:


36

শূন্য-ভিত্তিক অ্যারেগুলির সাথে কোঁকড়ানো-ব্রেসড প্রোগ্রামিং ভাষাগুলিতে , এর forমতো লুপগুলি লেখার প্রথাগত :

for (int i = 0; i < array.Length, i++) { }

এটি অ্যারের সমস্ত উপাদানকে অনুসরণ করে এবং এটি এখন পর্যন্ত সবচেয়ে সাধারণ ক্ষেত্রে। এটি <=বা এর ব্যবহার এড়ানো হয় >=

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

সংগ্রহগুলির জন্য, যে ভাষাগুলি পুনরাবৃত্তিকারীদের সমর্থন করে, এটি দেখা বেশি দেখা যায়:

foreach (var item in list) { }

যা সম্পূর্ণ তুলনা এড়ানো হয় avo

<=বনাম কখন ব্যবহার করবেন সে সম্পর্কে আপনি যদি একটি কঠোর এবং দ্রুত নিয়মের সন্ধান করেন <তবে একটি নেই; আপনার অভিপ্রায়টি সর্বোত্তমভাবে প্রকাশ করে তা ব্যবহার করুন। যদি আপনার কোডটিতে "ঘন্টা প্রতি 55 মাইল এর চেয়ে কম বা সমান" ধারণাটি প্রকাশ করা দরকার হয় তবে তা বলা উচিত <=, তা নয় <

গ্রেড ব্যাপ্তিগুলি সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য, >= 90আরও বোধগম্য হবে কারণ 90 হ'ল আসল সীমানা মান, 89 নয়।


9
এটি সম্পূর্ণরূপে তুলনা এড়াতে পারে না, এটি কেবল তাদেরকে গণকের প্রয়োগে সরিয়ে নিয়ে গালিচা দিয়ে জড়িয়ে দেয়। : পি
ম্যাসন হুইলার

2
অবশ্যই, তবে এটি এখন আর অ্যারে অনুসরণ করছে না, তাই না?
রবার্ট হার্ভে

4
কারণ অ্যারিগুলি এর forমতো লুপগুলির জন্য সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে । forআমি এখানে প্রদত্ত লুপের ফর্মটি অভিজ্ঞতার একটি মডিকাম সহ যে কোনও বিকাশকারীকে তাত্ক্ষণিকরূপে সনাক্তযোগ্য। আপনি যদি আরও নির্দিষ্ট দৃশ্যের ভিত্তিতে আরও সুনির্দিষ্ট উত্তর চান তবে আপনার এটিতে আপনার প্রশ্নের অন্তর্ভুক্ত করতে হবে।
রবার্ট হার্ভে

3
"আপনার উদ্দেশ্যকে সর্বোত্তমভাবে প্রকাশ করে তা ব্যবহার করুন" <- এটি!
জ্যাস্পার এন। ব্রুউয়ার

3
@ জ্যাস্পারএন.ব্রেউভার এটি প্রোগ্রামিংয়ের একটি জিরোথ আইনের মতো। সমস্ত শৈলীর বিধি এবং কোডিং কনভেনশনগুলি গভীর লজ্জার সাথে ভেঙে যায় যখন তাদের আদেশগুলি কোডের স্পষ্টতার সাথে বিরোধ করে।
আইভলনোটেক্সিস্ট আইডোনোটেক্সবাদ

16

এটা কোন ব্যাপার না।

তবে তর্কের খাতিরে, আসুন দুটি বিকল্পটি বিশ্লেষণ করা যাক: a > bবনাম a >= b

লেগে থাকা! সেগুলি সমান নয়!
ঠিক আছে, তারপরে a >= b -1বনাম a > bবা a > bবনাম a >= b +1

হুঁ, a >bএবং a >= bউভয় চেয়ে বর্ণন ভাল a >= b - 1এবং a >= b +11যাইহোক এই সব কি ? সুতরাং আমি যুক্তি দিয়েছি যে এর >পরিবর্তে >=বা তদ্বিপরীত থেকে কোনও লাভ হ'ল এলোমেলো 1এস যোগ বা বিয়োগ করে মুছে ফেলা হবে ।

তবে যদি এটি একটি সংখ্যা হয়? বলা ভাল a > 7নাকি a >= 6? এক সেকেন্ড অপেক্ষা কর. আমরা কি কঠোরভাবে বিতর্ক করছি যে >বনাম ব্যবহার করা >=এবং হার্ড কোডিং ভেরিয়েবলগুলি উপেক্ষা করা ভাল ? সুতরাং এটি সত্যিই একটি প্রশ্ন হয়ে ওঠে ... এর a > DAYS_OF_WEEKচেয়ে ভাল কিনা a >= DAYS_OF_WEEK_MINUS_ONEবা এটি a > NUMBER_OF_LEGS_IN_INSECT_PLUS_ONEবনাম a >= NUMBER_OF_LEGS_IN_INSECT? এবং আমরা 1কেবল চলক নামগুলিতে এই সময় যুক্ত / বিয়োগ করতে ফিরে এসেছি । বা থ্রোহোল্ড, সীমা, সর্বাধিক ব্যবহার করা ভাল কিনা তা নিয়ে বিতর্ক হতে পারে।

এবং দেখে মনে হচ্ছে কোনও সাধারণ নিয়ম নেই: এটি কি তুলনা করা হচ্ছে তার উপর নির্ভর করে

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


1
ঠিক আছে, কোনও সাধারণ নিয়ম নেই। (ভাবছেন কেন পাঠ্যপুস্তকে একটি সাধারণ নিয়ম বলেছিল, তবে আমি এটি ছেড়ে দিতে পারি)) এটি উদীয়মান conক্যমত্য নয় যে এটি একটি স্মৃতি স্মরণ করিয়েছিলাম।

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

1
কোডিং স্ট্যান্ডার্ড সম্পর্কে আমি অনেক ক্রেজি আলোচনা দেখেছি তবে এটি কেবল কেক নিতে পারে। সত্যিই নির্বোধ।
জিমি জেমস

@JimmyJames আলোচনা সম্পর্কে এই হল >বনাম >=অথবা আলোচনা সম্পর্কে আলোচনা >বনাম >=অর্থপূর্ণ? যদিও এটি সম্পর্কে আলোচনা এড়ানো সম্ভবত সবচেয়ে ভাল: পি
থানোস টিনটিনিডিস

2
"প্রোগ্রামগুলি মানুষের দ্বারা পড়া এবং ঘটনাক্রমে কম্পিউটারগুলি সম্পাদন করার জন্য বোঝানো হয়" - ডোনাল্ড নুথ। স্টাইলটি ব্যবহার করুন যা পড়া, বুঝতে এবং বজায় রাখা সবচেয়ে সহজ করে তোলে।
সরল ব্যবহারকারী

7

গণনা সেখানে ব্যবহার যখন খরচের কোন পার্থক্য নেই <বা >তুলনায় <=বা >=। এটি সমান হিসাবে দ্রুত গণনা করা হয়।

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

for(int i = 0; i < length; i++){
   array[i] = //...
   //...
}

একটি দিয়ে <=এটি করার জন্য আপনাকে অফ-বাই এক ত্রুটি এড়াতে কোথাও একটি -1 যুক্ত করতে হবে

for(int i = 1; i <= length; i++){
   array[i-1] = //...
   //...
}

অথবা

for(int i = 0; i <= length-1; i++){
   array[i] = //...
   //...
}

অবশ্যই যদি ভাষাটি 1-ভিত্তিক সূচক ব্যবহার করে তবে আপনি <= সীমাবদ্ধ শর্ত হিসাবে ব্যবহার করবেন।

কীটি হ'ল শর্তে প্রকাশিত মানগুলিই সমস্যার বর্ণনা থেকে থাকে। এটি পড়া পরিষ্কার

if(x >= 10 && x < 20){

} else if(x >= 20 && x < 30){

}

চেয়ে অর্ধ-খোলা ব্যবধানের জন্য

if(x >= 10 && x <= 19){

} else if(x >= 20 && x <= 29){

}

এবং 19 এবং 20 এর মধ্যে কোনও সম্ভাব্য মান নেই তা জানতে গণিত করতে হবে


আমি "দৈর্ঘ্য" ধারণাটি দেখতে পাচ্ছি, তবে আপনি যদি কেবলমাত্র কোথাও থেকে আগত মানগুলি ব্যবহার করে থাকেন এবং এটি একটি শুরু মান থেকে শেষের মান পর্যন্ত পুনরাবৃত্তি করতে বোঝায় তবে কী হয়। একটি শ্রেণির উদাহরণটি ছিল 5 থেকে 10 পর্যন্ত মার্কআপ শতাংশ, যা বলা যায় তা পরিষ্কার নয়: (মার্কআপ = 5; মার্কআপ <= 10; মার্কআপ ++) জন্য ... ? আমি কেন পরীক্ষায় এটি পরিবর্তন করব: মার্কআপ <11 ?

6
@ নোকম আপনি কী করবেন না, যদি আপনার সমস্যার বর্ণনা থেকে সীমানা মানগুলি 5 এবং 10 হয় তবে কিছুটা পরিবর্তিত মানের পরিবর্তে কোডগুলিতে সেগুলি স্পষ্ট করে দেওয়া ভাল।
ratchet freak

@nocomprende অধিকার বিন্যাস যখন উপরের বাউন্ড একটি প্যারামিটার আরো সুস্পষ্ট: for(markup = 5; markup <= MAX_MARKUP; ++markup)। অন্য যে কোনও কিছু এটিকে অতি জটিল করে তুলবে।
নবীন

1

আমি বলব যে বিন্দুটি আপনার> বা> = ব্যবহার করা উচিত কিনা তা নয়। বিন্দুটি হ'ল আপনাকে যেভাবে এক্সপ্রিভ কোড লিখতে দেয় তা ব্যবহার করা।

যদি আপনি দেখতে পান যে আপনার একটি যোগ / বিয়োগ করা প্রয়োজন, অন্য অপারেটরটি ব্যবহার করার বিষয়টি বিবেচনা করুন। আমি দেখতে পেয়েছি যে আপনি যখন আপনার ডোমেনের একটি ভাল মডেলটি শুরু করবেন তখন ভাল জিনিসগুলি ঘটে। তারপরে যুক্তি নিজেই লেখেন।

bool IsSpeeding(int kilometersPerHour)
{
    const int speedLimit = 90;
    return kilometersPerHour > speedLimit;
}

এটি এর চেয়েও বেশি উপায়ের মত

bool IsSpeeding(int kilometersPerHour)
{
    const int speedLimit = 90;
    return kilometersPerHour >= (speedLimit + 1);
}

অন্যান্য ক্ষেত্রে, অন্য উপায় ভাল:

bool CanAfford(decimal price, decimal balance)
{
    return balance >= price;
}

তুলনায় অনেক ভালো

bool CanAfford(decimal price, decimal balance)
{
    const decimal epsilon = 0e-10m;
    return balance > (price - epsilon);
}

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


2
গতির সীমা উদাহরণ একটি দুর্বল উদাহরণ। 90 কিলোমিটার জোনে 90 কিলোমিটার যাওয়ার গতিবেগ হিসাবে বিবেচনা করা হয় না। একটি গতির সীমা অন্তর্ভুক্ত।
eidsonator

আপনি একেবারে সঠিক, আমার পক্ষ থেকে মস্তিষ্ক ফার্ট। আরও ভাল উদাহরণ ব্যবহার করার জন্য এটি সম্পাদনা করতে দ্বিধা বোধ করুন, আশা করি বিন্দুটি পুরোপুরি হারিয়েছে না।
সারা

0

আপনি আপনার প্রশ্নে উল্লেখ করেছেন যে, ফ্লোট ভেরিয়েবলের সমতার জন্য পরীক্ষা করা নির্ভরযোগ্য নয়।

একই জন্য <=এবং সত্য >=

তবে পূর্ণসংখ্যার ধরণের ক্ষেত্রে এই ধরনের নির্ভরযোগ্যতার কোনও সমস্যা নেই। আমার মতে, লেখক তার মতামত প্রকাশ করছিলেন যেটি বেশি পাঠযোগ্য।

আপনি তার সাথে একমত হন বা না করেন অবশ্যই আপনার মতামত।


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

লেখকের লিঙ্গ অপ্রাসঙ্গিক, তবে আমি যাইহোক আমার উত্তর আপডেট করেছি। আমি যে বিশেষ সমস্যাটি সমাধান করছি তার জন্য সবচেয়ে প্রাকৃতিক কী তা বেছে নেওয়া <বা তার <=উপর ভিত্তি করে পছন্দ করি। অন্যরা যেমন উল্লেখ করেছে, ফর ফর লুপে <সি-টাইপের ভাষাগুলি আরও বেশি বোঝায়। অন্যান্য ব্যবহারের ক্ষেত্রেও সুবিধা রয়েছে <=। আপনার নিষ্পত্তির সমস্ত সরঞ্জাম কখন কখন উপযুক্ত হবে তা ব্যবহার করুন।
ডান পিচেলম্যান

একমত নন। সেখানে পারেন পূর্ণসংখ্যা ধরনের সঙ্গে নির্ভরযোগ্যতা বিষয় হতে: সি, বিবেচনা করুন: for (unsigned int i = n; i >= 0; i--)বা for (unsigned int i = x; i <= y; i++)যদি yহতে হবে UINT_MAX। উফ, চিরকাল সেই লুপ।
জেমসডলিন

-1

সম্পর্কের প্রতিটি <, <=, >=, >এবং এছাড়াও == এবং !=দুই ফ্লোটিং পয়েন্ট মান তুলনা জন্য তাদের ব্যবহার-মামলা আছে। প্রত্যেকটির একটি নির্দিষ্ট অর্থ রয়েছে এবং উপযুক্তটি বেছে নেওয়া উচিত।

আমি যেসব ক্ষেত্রে আপনি প্রতিটিটির জন্য ঠিক এই অপারেটর চান তার উদাহরণ দেব। (যদিও এনএএনএস সম্পর্কে সচেতন থাকুন))

  • আপনার একটি ব্যয়বহুল খাঁটি ফাংশন রয়েছে fযা ইনপুট হিসাবে ভাসমান-পয়েন্ট মান নেয় takes আপনার কম্পিউটেশন গতি বাড়াতে জন্য, আপনাকে অতি সম্প্রতি নির্ণিত মূল্যবোধের ক্যাশে, যেমন, একটি লুকআপ টেবিল ম্যাপিং যোগ করার সিদ্ধান্ত নেন xকরতে f(x)। আপনি ==যুক্তিগুলির তুলনা করতে সত্যই ব্যবহার করতে চাইবেন ।
  • আপনি জানতে চান যে আপনি কিছু সংখ্যার দ্বারা অর্থপূর্ণভাবে ভাগ করতে পারেন x? আপনি সম্ভবত ব্যবহার করতে চান x != 0.0
  • আপনি জানতে চান যে মানটি xইউনিটের ব্যবধানে আছে কিনা ? (x >= 0.0) && (x < 1.0)সঠিক অবস্থা।
  • আপনি dএকটি ম্যাট্রিক্স নির্ধারক গণনা করেছেন এবং এটি ইতিবাচক নিশ্চিত কিনা তা বলতে চান? আর কিছু ব্যবহার করার কারণ নেই d > 0.0
  • আপনি জানতে চান Σ n = 1,…, ∞ n −α ডাইভারেজ হয় কিনা ? আমি পরীক্ষা করতাম alpha <= 1.0

ভাসমান-পয়েন্ট গণিত (সাধারণভাবে) সঠিক নয়। তবে এর অর্থ এই নয় যে আপনার এটিকে ভয় করা উচিত, একে যাদু হিসাবে বিবেচনা করা উচিত এবং অবশ্যই সবসময় দুটি ভাসমান-পয়েন্ট পরিমাণের সাথে যদি সেগুলির মধ্যে থাকে তবে সমান আচরণ করবেন না 1.0E-10। এটি করার ফলে আপনার গণিতটি সত্যই ভেঙে যাবে এবং সমস্ত অদ্ভুত জিনিস ঘটবে।

  • উদাহরণস্বরূপ, যদি আপনি উপরে বর্ণিত ক্যাশের সাথে অস্পষ্ট তুলনা ব্যবহার করেন তবে আপনি হাস্যকর ত্রুটিগুলি প্রবর্তন করবেন। তবে আরও খারাপটি, ফাংশনটি আর বিশুদ্ধ হবে না এবং ত্রুটিটি আগের গণিত ফলাফলগুলির উপর নির্ভর করে!
  • হ্যাঁ, এমনকি যদি x != 0.0এবং yএকটি নির্দিষ্ট ফ্লোটিং পয়েন্ট মান, y / xপ্রয়োজন সসীম না। তবে অতিরিক্ত y / xপ্রবাহের কারণে সীমাবদ্ধ নয় বা শুরু করার জন্য অপারেশনটি গাণিতিকভাবে ভাল-সংজ্ঞায়িত হয়নি তা জানার জন্য এটি প্রাসঙ্গিক হতে পারে ।
  • আপনার যদি এমন কোনও ফাংশন থাকে যা পূর্ব শর্ত হিসাবে একটি ইনপুট প্যারামিটারটি xইউনিটের ব্যবধানে থাকতে হবে [0, 1), আমি এটির সাথে x == 0.0বা ডেকে ডাকার পরে যদি একটি দৃ failure়তা ব্যর্থতা বরখাস্ত করি তবে আমি সত্যিই খারাপ হই x == 1.0 - 1.0E-14
  • আপনি যে নির্ণায়ক গণনা করেছেন তা সঠিক নাও হতে পারে। তবে আপনি যদি ভান করতে চলেছেন যে গণিত নির্ধারক যখন ম্যাট্রিক্স ইতিবাচক সুনির্দিষ্ট নয় 1.0E-30, কিছুই লাভ হয় না। আপনি যা করেছিলেন তা ভুল উত্তর দেওয়ার সম্ভাবনা বাড়িয়েছিল
  • হ্যাঁ, আপনার যুক্তি alphaগোলাকার ত্রুটিগুলির দ্বারা প্রভাবিত হতে পারে এবং তাই alpha <= 1.0সত্য হতে পারে যদিও অভিব্যক্তির জন্য প্রকৃত গাণিতিক মানটি alphaসম্ভবত 1 এর চেয়ে বেশি হতে পারে তবে এই মুহুর্তে আপনি সম্ভবত এটি করার মতো কিছুই নেই।

সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের মতো সর্বদা যথাযথ স্তরে ত্রুটিগুলি পরিচালনা করুন এবং কেবল একবারেই হ্যান্ডেল করুন। আপনি যদি ক্রমের ক্রমে গোলাকার ত্রুটি যুক্ত করেন 1.0E-10(এটি বেশিরভাগ লোকেরা ব্যবহার করে এমন যাদু মান বলে মনে হয়, তবে আমি জানি না কেন) প্রতিবার আপনি যখন ভাসমান-পয়েন্টের পরিমাণের তুলনা করছেন, আপনি শীঘ্রই ক্রমের ত্রুটিতে থাকবেন 1.0E+10...


1
সর্বাধিক চমৎকার উত্তর, যদিও স্বীকার করা হয়েছে, কেবল যেটি জিজ্ঞাসা করা হয়েছে তার চেয়ে আলাদা প্রশ্নের জন্য।
দেবী মরগান

-2

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

uint16_t n = ...;
for (uint16_t i=1; i<=n; i++)
  ...  [loop doesn't modify i]

একটি সংকলক ধরে নিতে পারে যে উপরের শর্তটি nth পাস লুপের পরে লুপটি প্রস্থান করতে পারে যদি না এন 65535 না পারে এবং লুপ আমি n ছাড়িয়ে অন্য কোনও ফ্যাশনে প্রস্থান করতে পারি। যদি এই শর্তগুলি প্রযোজ্য হয় তবে সংকলকটিকে অবশ্যই কোড তৈরি করতে হবে যা উপরের শর্ত ব্যতীত অন্য কোনও কিছু না হওয়া পর্যন্ত লুপটি চলতে পারে।

যদি লুপটি পরিবর্তে লিখিত হত:

uint16_t n = ...;
for (uint16_t ctr=0; ctr<n; ctr++)
{
  uint16_t i = ctr+1;
  ... [loop doesn't modify ctr]
}

তারপরে একটি সংকলক নিরাপদে ধরে নিতে পারে যে লুপটি কখনও n বারের বেশি চালিত হওয়ার প্রয়োজন হয় না এবং এইভাবে আরও কার্যকর কোড তৈরি করতে সক্ষম হতে পারে।

মনে রাখবেন যে স্বাক্ষরযুক্ত ধরণের কোনও যে কোনও ওভারফ্লোতে খারাপ কাজ হতে পারে। প্রদত্ত:

int total=0;
int start,lim,mult; // Initialize values somehow...
for (int i=start; i<=lim; i++)
  total+=i*mult;

একটি সংকলক এটিকে আবার লিখতে পারে:

int total=0;
int start,lim,mult; // Initialize values somehow...
int loop_top = lim*mult;
for (int i=start; i<=loop_top; i+=mult)
  total+=i;

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


হ্যাঁ, আমি মনে করি এটি পাঠ্যপুস্তকের সাথে কিছুটা দূরে। এখনও বিবেচনা করা হয়নি। সংকলক অপ্টিমাইজেশানগুলি বোঝার জন্য দরকারী, এবং ওভারফ্লো এড়াতে হবে, তবে এটি আমার প্রশ্নের অনুপ্রেরণা ছিল না, যা লোকেরা কীভাবে কোড বোঝে সে ক্ষেত্রে এটি আরও বেশি ছিল। X> 5 বা x> = 6 পড়া কি সহজ? ঠিক আছে, এটি নির্ভর করে ...

আপনি যদি আরডুইনোর পক্ষে না লিখেন তবে অবধি মানটির সর্বাধিক মান 65535 এর থেকে কিছুটা বেশি হয়ে যাবে
কোরি

1
@ কোরি: যে ধরনের প্ল্যাটফর্ম যেখানে টাইপ রয়েছে সেখানে uint16_t এর সর্বাধিক মান 65535 হবে; আমি প্রথম উদাহরণে uint16_t ব্যবহার করেছি কারণ আমি প্রত্যাশা করব যে uint32_t এর চেয়ে আরও বেশি লোকেরা uint16_t এর সঠিক সর্বাধিক মান জানতে পারে। উভয় ক্ষেত্রে একই পয়েন্ট প্রয়োগ করা হবে। দ্বিতীয় উদাহরণটি "ইনট" প্রকারের বিষয়ে অজ্ঞেয়বাদী এবং এটি একটি সমালোচিত আচরণগত বিন্দুর প্রতিনিধিত্ব করে যা আধুনিক সংকলকগুলির সম্পর্কে অনেকেই চিনতে ব্যর্থ হন।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.