কোনও সি (++) প্রোগ্রামে ক্ষুদ্রতম নেতিবাচক মান (যেমন নেতিবাচক অনন্ততা ব্যবহার করার জন্য) উপস্থাপনের জন্য কি কোনও স্ট্যান্ডার্ড এবং / বা পোর্টেবল উপায় আছে?
ভাসা-র মধ্যে DBL_MIN হ'ল ক্ষুদ্রতম ধনাত্মক সংখ্যা।
কোনও সি (++) প্রোগ্রামে ক্ষুদ্রতম নেতিবাচক মান (যেমন নেতিবাচক অনন্ততা ব্যবহার করার জন্য) উপস্থাপনের জন্য কি কোনও স্ট্যান্ডার্ড এবং / বা পোর্টেবল উপায় আছে?
ভাসা-র মধ্যে DBL_MIN হ'ল ক্ষুদ্রতম ধনাত্মক সংখ্যা।
উত্তর:
-DBL_MAX
এএনএসআই সি-তে , যা ফ্লোট। h এ সংজ্ঞায়িত।
-DBL_MAX
হুবহু উপস্থাপনযোগ্য হওয়া দরকার , সুতরাং যদি এফপি হার্ডওয়্যার এটি সক্ষম না হয় তবে বাস্তবায়নটি কেবল তার চারপাশে কাজ করতে হবে। 5.2.4.2.2 এ ভাসমান-পয়েন্ট মডেলটি দেখুন C99 এর ভাসমান ধরণের <ফ্লোট। H> পি 2 এর বৈশিষ্ট্য (তখন থেকে অন্য কোথাও স্থানান্তরিত হতে পারে)।
DBL_MAX
ঠিক ঠিক (1 - b ^ )p) b ^ e_max, যা ঠিক উপস্থাপনযোগ্য, সর্বাধিক-নেতিবাচক সীমাবদ্ধ মানটি হ'ল - (1 - বি ^ -p) খ ^ e_max এবং যেহেতু যে ঠিক হতে হবে -DBL_MAX
, অস্বীকার DBL_MAX
কোন rounding ত্রুটি পারেন পরিচয় করিয়ে করতে পারবে না।
ভাসমান পয়েন্ট সংখ্যা (আইইইই 754) প্রতিসম হয়, তাই আপনি যদি সর্বোচ্চ মান ( DBL_MAX
বা numeric_limits<double>::max()
) উপস্থাপন করতে পারেন তবে কেবল একটি বিয়োগ চিহ্নটি প্রিপেন্ড করুন।
এবং তারপরে দুর্দান্ত উপায়:
double f;
(*((long long*)&f))= ~(1LL<<52);
সি তে, ব্যবহার করুন
#include <float.h>
const double lowest_double = -DBL_MAX;
সি ++ প্রাক -11 এ, ব্যবহার করুন
#include <limits>
const double lowest_double = -std::numeric_limits<double>::max();
সি ++ 11 এবং তারপরে, ব্যবহার করুন
#include <limits>
constexpr double lowest_double = std::numeric_limits<double>::lowest();
min()
সি ++ 11 এর আগে কি ফাংশনটি উপলব্ধ ছিল না ? নাকি এর চেয়ে আলাদা মান -max()
? en.cppreferences.com/w/cpp/tyype/numeric_limits
min
আপনি মাত্রার সবচেয়ে ক্ষুদ্রতম ধনাত্মক মান এবং মাত্রার lowest
সবচেয়ে বড় নেতিবাচক মান পেয়ে যাচ্ছেন। হ্যাঁ, এটা ভয়ানক। সি ++ স্ট্যান্ডার্ড লাইব্রেরির উজ্জ্বল বিশ্বে আপনাকে স্বাগতম :-P
।
float.h
। limits.h
পূর্ণসংখ্যার জন্য
এটা চেষ্টা কর:
-1 * numeric_limits<double>::max()
তথ্যসূত্র: numeric_limits
এই শ্রেণিটি প্রতিটি মৌলিক ধরণের জন্য বিশেষায়িত, এর সদস্যরা ফিরে আসে বা বিভিন্ন মানগুলিতে সেট করে যা নির্দিষ্ট প্ল্যাটফর্মটিতে সংকলন করে এমন বৈশিষ্ট্যগুলি নির্দিষ্ট করে।
-numeric_limits<double>::max()
?
-1 * ...
এটি আরও পরিষ্কার করার জন্য ব্যবহার করুন।
আপনি কি প্রকৃত অনন্ত বা ন্যূনতম সীমাবদ্ধ মান খুঁজছেন? প্রাক্তন যদি, ব্যবহার
-numeric_limits<double>::infinity()
যা কেবল যদি কাজ করে
numeric_limits<double>::has_infinity
অন্যথায়, আপনি ব্যবহার করা উচিত
numeric_limits<double>::lowest()
যা সি ++ 11 এ পরিচিত ছিল।
যদি lowest()
উপলভ্য না হয় তবে আপনি এখানে ফিরে যেতে পারেন
-numeric_limits<double>::max()
যা lowest()
নীতিগতভাবে পৃথক হতে পারে , তবে সাধারণত অনুশীলনে হয় না।
-numeric_limits<double>::max()
এটি অনুশীলনে কাজ করলেও তত্ত্বের ক্ষেত্রে পুরোপুরি পোর্টেবল হয় না।
সি ++ 11 হিসাবে আপনি ব্যবহার করতে পারেন numeric_limits<double>::lowest()
। মান অনুযায়ী, এটি আপনি যা খুঁজছেন ঠিক তা ফেরত দেয়:
একটি সীমাবদ্ধ মান x এর মতো অন্য কোনও সীমাবদ্ধ মান y নেই
y < x
।
সব বিশেষায়িত জন্য অর্থপূর্ণ যাis_bounded != false
।
অনেক উত্তর চলেছে -std::numeric_limits<double>::max()
।
ভাগ্যক্রমে, তারা বেশিরভাগ ক্ষেত্রে ভাল কাজ করবে। ফ্লোটিং পয়েন্ট এনকোডিং স্কিমগুলি একটি ম্যান্টিসা এবং একটি এক্সপোনেন্টে একটি সংখ্যা পচিয়ে দেয় এবং তাদের বেশিরভাগ (যেমন জনপ্রিয় আইইইই -754 ) একটি স্বতন্ত্র চিহ্ন বিট ব্যবহার করে, যা ম্যান্টিসার সাথে সম্পর্কিত নয়। এটি কেবল সাইনটি উল্টিয়ে ক্ষুদ্রতম নেতিবাচক ক্ষেত্রে বৃহত্তম ধনাত্মককে রূপান্তর করতে দেয়:
মান কোনও ভাসমান পয়েন্ট স্ট্যান্ডার্ড চাপায় না।
আমি সম্মত হই যে আমার যুক্তিটি কিছুটা তাত্ত্বিক, তবে মনে করুন যে কিছু এক্সেনট্রিক সংকলক প্রস্তুতকারক একটি বিপ্লবী এনকোডিং স্কিমটি কোনও দু'জনের পরিপূরকের কিছু প্রকরণে এনকোডড ম্যান্টিসার সাথে ব্যবহার করবেন । দুটির পরিপূরক এনকোডিং প্রতিসম নয়। উদাহরণস্বরূপ একটি স্বাক্ষরিত 8 বিট চরের জন্য সর্বাধিক ধনাত্মক 127, তবে সর্বনিম্ন নেতিবাচক -128। সুতরাং আমরা কিছু ভাসমান পয়েন্ট এনকোডিং অনুরূপ অসমমিত আচরণের ধারণা করতে পারি।
আমি এর মতো কোনও এনকোডিং স্কিম সম্পর্কে অবগত নই, তবে মূল বিষয়টি হ'ল মানটি গ্যারান্টি দেয় না যে সাইনটি উল্টানো উদ্দেশ্যযুক্ত ফলাফল দেয় । সুতরাং এই জনপ্রিয় উত্তর (দুঃখিত ছেলেরা) পুরোপুরি পোর্টেবল মান সমাধান হিসাবে বিবেচনা করা যায় না! / * কমপক্ষে না যদি আপনি numeric_limits<double>::is_iec559
সত্যটি জোড় না করেন তবে * /
মূল প্রশ্নটি অসীমকে উদ্বেগ করে। সুতরাং, কেন ব্যবহার করবেন না
#define Infinity ((double)(42 / 0.0))
আইইইই সংজ্ঞা অনুসারে? আপনি অবশ্যই তা প্রত্যাখ্যান করতে পারেন।
numeric_limits<double>::has_infinity && ! numeric_limits<double>::traps
কোনও সি (++) প্রোগ্রামে ক্ষুদ্রতম নেতিবাচক মান (যেমন নেতিবাচক অনন্ততা ব্যবহার করার জন্য) উপস্থাপনের জন্য কি কোনও স্ট্যান্ডার্ড এবং / বা পোর্টেবল উপায় আছে?
সি পদ্ধতির।
অনেকগুলি প্রয়োগগুলি +/- ইনফিনিটিকে সমর্থন করে, তাই সর্বাধিক নেতিবাচক double
মান -INFINITY
।
#include <math.h>
double most_negative = -INFINITY;
কোনও মানক এবং / অথবা বহনযোগ্য উপায় আছে ....?
এখন আমাদের অন্যান্য ক্ষেত্রেও বিবেচনা করা দরকার:
সহজভাবে -DBL_MAX
।
আমি এই ক্ষেত্রে আশা করতাম, ওপি পছন্দ করবে -DBL_MAX
।
DBL_MAX
।এটি একটি অস্বাভাবিক ঘটনা, সম্ভবত ওপির উদ্বেগের বাইরে। কাঙ্ক্ষিত পরিসীমা / প্রেভিশন অর্জনের double
জন্য যখন একটি ভাসমান পয়েন্টের জুটি হিসাবে এনকোড করা হয় ( ডাবল-ডাবল দেখুন ) সেখানে সর্বাধিক স্বাভাবিক double
এবং সম্ভবত একটি বৃহত্তর ডি-নরমাল উপস্থিত থাকে । আমি বিতর্ক দেখেছি যদি উভয়ের DBL_MAX
মধ্যে সর্বাধিক স্বাভাবিকের উল্লেখ করা উচিত ।
ভাগ্যক্রমে এই জোড় করা পদ্ধতির মধ্যে সাধারণত একটি অন্তঃসত্তা অন্তর্ভুক্ত থাকে, তাই সর্বাধিক নেতিবাচক মানটি থেকে যায় -INFINITY
।
আরও বহনযোগ্যতার জন্য, কোডটি রুটে যেতে পারে
// HUGE_VAL is designed to be infinity or DBL_MAX (when infinites are not implemented)
// .. yet is problematic with unsigned infinity.
double most_negative1 = -HUGE_VAL;
// Fairly portable, unless system does not understand "INF"
double most_negative2 = strtod("-INF", (char **) NULL);
// Pragmatic
double most_negative3 = strtod("-1.0e999999999", (char **) NULL);
// Somewhat time-consuming
double most_negative4 = pow(-DBL_MAX, 0xFFFF /* odd value */);
// My suggestion
double most_negative5 = (-DBL_MAX)*DBL_MAX;
আপনার যদি ভাসা ব্যতিক্রমগুলি সক্ষম না করা থাকে (যা আপনার ইমো করা উচিত নয়), আপনি কেবল বলতে পারেন:
double neg_inf = -1/0.0;
এটি নেতিবাচক অসীম লাভ করে। আপনার যদি একটি ভাসা প্রয়োজন, আপনি হয় ফলাফল নিক্ষেপ করতে পারেন
float neg_inf = (float)-1/0.0;
বা একক নির্ভুলতা গণিত ব্যবহার করুন
float neg_inf = -1.0f/0.0f;
ফলাফল সর্বদা এক রকম হয়, একক এবং দ্বিগুণ উভয় ক্ষেত্রে যথার্থই নেতিবাচক অনন্ততার উপস্থাপনা রয়েছে এবং তারা প্রত্যাশা অনুযায়ী একে অপরকে রূপান্তরিত করে।
-INFINITY
neg_inf
এটি একটি ধ্রুবক মানের সাথে আরম্ভ করা হয়েছে । সংকলক inf
মানটি গণনার ক্ষেত্রে যত্ন নেবে । এবং যখন আপনি এটি সর্বাধিক গণনার জন্য নাল-মান হিসাবে ব্যবহার করেন, প্রথম পুনরাবৃত্তি সাধারণত এটি একটি বৃহত্তর মান দিয়ে ওভাররাইট করে। অর্থাৎ পারফরম্যান্স খুব কমই একটি সমস্যা is এবং ওপি বিশেষত "যেমন নেতিবাচক অনন্ত ব্যবহার করতে" সম্পর্কে জিজ্ঞাসা করে, এবং -inf
সত্যই এটির সঠিক উত্তর only আপনি একটি সঠিক এবং দরকারী উত্তরকে প্রত্যাখ্যান করেছেন।