আমি কীভাবে তার সর্বাধিক / মিনিটের মানটিতে ভাসা শুরু করব?


101

আমি কীভাবে হার্ড ফ্লোট বা ডাবলের জন্য একটি সর্বোচ্চ সর্বোচ্চ বা সর্বনিম্ন মানকে কোড করব? আমি কেবল পুনরাবৃত্তি করে এবং সবচেয়ে বড়টি ধরে একটি অ্যারের সর্বোচ্চ / মিনিট সন্ধান করতে চাই।

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

উত্তর:


154

প্রকারের সর্বনিম্ন বা সর্বাধিক মান std::numeric_limitsসন্ধান <limits>করার জন্য আপনি কোনটি সংজ্ঞায়িত করা হয়েছে তা ব্যবহার করতে পারেন (যতক্ষণ না টাইপের জন্য কোনও বিশেষায়নের উপস্থিতি রয়েছে)। আপনি এটি অনন্ত পুনরুদ্ধার করতেও ব্যবহার করতে পারেন (এবং -নেতিবাচক অসীমের জন্য সামনে রেখে দিন)।

#include <limits>

//...

std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();

মন্তব্যে উল্লিখিত হিসাবে, min()সর্বনিম্ন সম্ভাব্য ধনাত্মক মান প্রদান করে। অন্য কথায় 0 এর নিকটতম ধনাত্মক মান যা উপস্থাপিত হতে পারে। সর্বনিম্ন সম্ভাব্য মানটি সর্বাধিক সম্ভাব্য মানের নেতিবাচক।

অবশ্যই আছে std::max_elementএবং min_element ফাংশন (সংজ্ঞায়িত <algorithm>) যা অ্যারের বৃহত্তম বা ক্ষুদ্রতম মান সন্ধানের জন্য ভাল পছন্দ হতে পারে।


আমি কীভাবে এটি সঠিকভাবে ব্যবহার করব? আমার কী অন্তর্ভুক্ত করা দরকার? আমি মনে করি না আগে আমি এরকম কিছু ব্যবহার করেছি।
ব্যর্থ হয়েছে

হুম ... যে সর্বাধিক উপাদান ফাংশনটি খুব উপকারী হত ... আপনি যখন নিজে থেকে কোডিং শিখবেন এবং আনুষ্ঠানিকভাবে নয় তখনই এটি ঘটে। আপনি 50 বার চাকা পুনর্বহাল শেষ। এটি সিল () সম্পর্কে সর্বশেষবারের মতো শিখলাম। ধন্যবাদ.
16

18
@ ইয়াকোবি, আপনি স্পষ্ট করে বলতে পারেন যে সংখ্যাসূচক_লিট <ফ্লোট> :: মিনিট () এর অর্থ সর্বাধিক নেতিবাচক মান নয়, এর অর্থ ক্ষুদ্রতম ধনাত্মক।
এমএসএন

13
@ কিলোগ্রে: সি ++ 11 যুক্ত হয়েছে numeric_limits<T>::lowest(), যা এই সমস্যাটি সমাধান করার জন্য টাইপটির পক্ষে সর্বনিম্ন (negative ণাত্মক ) মান প্রদান করে।
কর্নস্টালক

4
std::numeric_limits<float>::min()নেই না ক্ষুদ্রতম ইতিবাচক মান যে প্রতিনিধিত্ব করা যাবে দিতে; এটি সর্বনিম্ন সাধারণ একক-নির্ভুলতা ভাসমান পয়েন্ট সংখ্যা দেয়। এছাড়াও রয়েছে উপাভিলম্ব শূন্য এবং এই সংখ্যাটি মধ্যে নম্বর। বিশেষত, std::numeric_limits<float>::min()দেয় 1.17549e-38তবে ক্ষুদ্রতম উপস্থাপনযোগ্য সাবমনোরাল ফ্লোট nextafterf(0.0f, 1.0f) == 1.4013e-45f
নিবোট

47

হয় আপনি ব্যবহার করতে পারেন -FLT_MAX(অথবা -DBL_MAX) সর্বাধিক মাত্রার ঋণাত্মক সংখ্যা এবং জন্য FLT_MAX(অথবা DBL_MAX) ইতিবাচক জন্য। এটি আপনাকে সম্ভাব্য ভাসমান (বা দ্বিগুণ) মানের সীমা দেয়।

আপনি সম্ভবত ব্যবহার করতে চান না FLT_MIN; এটি সর্বনিম্ন মাত্রার ধনাত্মক সংখ্যার সাথে মিলে যায় যা একটি ফ্লোটের সাথে উপস্থাপিত হতে পারে, ভাসমানের সাথে উপস্থাপনযোগ্য সর্বাধিক নেতিবাচক মান নয়।

FLT_MINএবং FLT_MAXঅনুরূপ std::numeric_limits<float>::min()এবং std::numeric_limits<float>::max()


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

4
"[ FLT_MIN] ক্ষুদ্রতম মাত্রার ধনাত্মক সংখ্যার সাথে সামঞ্জস্য করে যা একটি ভাসা দিয়ে উপস্থাপন করা যায়" - এটি সত্য নয় । এটি সবচেয়ে ছোট সাধারণ সংখ্যা। এছাড়াও আছে সাধারণ নাম্বার।
নিবোট

আপনি FLT_TRUE_MINপ্রকৃততম ক্ষুদ্রতম সম্ভাব্য ফ্লোটটি চান, যা এর সাথে std::numeric_limits<float>::denorm_min()
ক্রিস ডড

17

অ্যারের মধ্যে সবচেয়ে ছোট / বৃহত্তম সন্ধানের জন্য সবচেয়ে ছোট / বৃহত্তম হতে আরম্ভ করার কোনও বাস্তব প্রয়োজন নেই:

double largest = smallest = array[0];
for (int i=1; i<array_size; i++) {
    if (array[i] < smallest)
        smallest = array[i];
    if (array[i] > largest0
        largest= array[i];
}

অথবা, যদি আপনি এটি একাধিকবার করছেন:

#include <utility>

template <class iter>
std::pair<typename iter::value_type, typename iter::value_type> find_extrema(iter begin, iter end) {
    std::pair<typename iter::value_type, typename iter::value_type> ret;
    ret.first = ret.second = *begin;
    while (++begin != end) {
        if (*begin < ret.first)
           ret.first = *begin;
        if (*begin > ret.second)
           ret.second = *begin;
   }
   return ret;
}

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

মনে রাখবেন যে স্ট্যান্ডার্ডটিতে একটি মিনি_ইলেট এবং সর্বোচ্চ_সংশ্লিষ্ট রয়েছে, এটি ব্যবহার করে ডেটা দিয়ে দু'বার স্ক্যান করা প্রয়োজন যা অ্যারেটি যদি বড় হয় তবে সমস্যা হতে পারে। সাম্প্রতিক স্ট্যান্ডার্ডগুলি এটিকে যুক্ত করে সম্বোধন করেছে std::minmax_elementযা find_extremaউপরের মত একই কাজ করে (একক পাসে কোনও সংখ্যায় ন্যূনতম এবং সর্বাধিক উভয় উপাদান সন্ধান করুন)।

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

unsigned int min_nonzero(std::vector<unsigned int> const &values) { 
    if (vector.size() == 0)
        return 0;
    unsigned int temp = values[0]-1;
    for (int i=1; i<values.size(); i++)
        if (values[i]-1 < temp)
            temp = values[i]-1;
    return temp+1;
}

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


তবে আপনি এটির জন্য আমার কাছ থেকে একটি +1 পান!
ড্যান ডিপ্লো

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

@ ফাকা: তারপরেও আপনি তুলনা ফাংশনটি সংজ্ঞায়িত করতে পারেন যা শূন্যকে সবচেয়ে বড় সম্ভাব্য মান হিসাবে বিবেচনা করে, আপনি এখনও ব্যবহার করতে পারেন std::min_element:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
আঙ্কেলবেন্স

4
@ জেরি: সি ++ 0x আপনার উল্লিখিত সমস্যার সমাধান করতে মিনিম্যাক্স_এলিমেন্ট যুক্ত করবে। (তবে তারপরে শূন্যগুলি উপেক্ষা করা সম্ভব হবে না ...)
আঙ্কেলবেন্স

4
প্রথম উপাদানটি আরম্ভের সময় পাওয়া না গেলে কী হবে? অনলাইন প্রক্রিয়াকরণে এটি অনেক কিছুই ঘটে (যেমন: সংযোজক হিসাবে)
কিলোগ্রে

5

ম্যানুয়ালি কোনও অ্যারের ন্যূনতম সন্ধান করতে আপনাকে ভাসমানটির সর্বনিম্ন মান জানতে হবে না:

float myFloats[];
...
float minimum = myFloats[0];
for (int i = 0; i < myFloatsSize; ++i)
{
  if (myFloats[i] < minimum)
  {
    minimum = myFloats[i];
  }
}

এবং সর্বাধিক মান জন্য অনুরূপ কোড।


4

আমি কি সুপারিশ করতে পারি যে আপনি আপনার "সর্বোচ্চ এবং সর্বনিম্ন মিনিট" ভেরিয়েবলগুলি অনন্ত নয়, অ্যারেতে প্রথম সংখ্যায় শুরু করতে পারেন?

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