সি ++ 11, 14, 17 বা 20 পাই এর জন্য একটি স্ট্যান্ডার্ড ধ্রুবক পরিচয় দেয়?


170

সি এবং সি ++ নাম্বার পাইটির সাথে একটি বরং নির্বিকার সমস্যা রয়েছে। যতদূর আমি জানি M_PIসংজ্ঞায়িত math.hকোনও মানক দ্বারা আবশ্যক নয়।

নতুন সি ++ স্ট্যান্ডার্ডগুলি স্ট্যান্ডার্ড লাইব্রেরিতে অনেক জটিল গণিতের প্রচলন করেছিল - হাইপারবোলিক ফাংশন std::hermiteএবং std::cyl_bessel_i, বিভিন্ন এলোমেলো সংখ্যা জেনারেটর এবং আরও অনেক কিছু।

'নতুন' মানকগুলির মধ্যে কোনও পাইয়ের জন্য একটি ধ্রুবক এনেছিল? তা না হলে - কেন? কীভাবে এই সমস্ত জটিল গণিত এটি ছাড়া কাজ করে?

আমি সি ++ তে পাই সম্পর্কে অনুরূপ প্রশ্নগুলি সম্পর্কে সচেতন (তারা বেশ কয়েকটি বছর এবং মান পুরানো); আমি সমস্যার বর্তমান অবস্থা জানতে চাই।

ওহ কেন সি ++ এর এখনও পাই ধ্রুবক নেই তবে এর মধ্যে আরও জটিল গণিত রয়েছে সে সম্পর্কে আমি খুব আগ্রহী ।

ইউপিডি: আমি জানি যে আমি পাইকে নিজেকে 4 * আতান (1) বা একোস (1) বা ডাবল পাই = 3.14 হিসাবে সংজ্ঞায়িত করতে পারি। অবশ্যই। তবে কেন 2018 এ আমি এখনও এটি করতে হবে? পাই ছাড়া স্ট্যান্ডার্ড গণিতের ফাংশনগুলি কীভাবে কাজ করবে?

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


আপনি সেরা প্ল্যাটফর্ম ইন্ডিপেন্ডেন্ট পাই ধ্রুবক হিসাবে পুরানো প্রশ্নের অস্তিত্ব নোট করেন ? । আপনি যদি উদ্বেগ প্রকাশ করেন যে সেগুলির মেয়াদ শেষ হয়ে গেছে তবে আপনি তাদের সি ++ 17 ইত্যাদির উপর ভিত্তি করে উত্তর চেয়ে জিজ্ঞাসা করে সর্বদা একটি বন্টি সেট করতে পারেন ... তারপরে সমস্ত উত্তর এক জায়গায় থাকবে। এখনও কেন একটি ভাল প্রশ্ন তবে সম্ভবত এটি কেন এবং ততকালীন তারিখের জন্য জিজ্ঞাসা করা উচিত বিদ্যমান প্রশ্নের উপর অনুদান হওয়া উচিত।
শফিক ইয়াঘমোর

আমি মনে করি যে এটি নতুন উত্তর যুক্ত করার উপযুক্ত হতে পারে যেহেতু আমি জানি যতটা সি ++ 20 একটি পাই ধ্রুবক যুক্ত করেছে
গিলাইম র্যাকিকোট

প্রশ্নটি আপডেট করে নিলাম এটি এখনও আনুষ্ঠানিকভাবে শেষ না হওয়ার কারণে আমাদের সি ++ ২০ ঠিকানা দেওয়া উচিত কিনা তা নিশ্চিত নয়।
Amomum

@ গুইলাউম র্যাকিকোট: একটি যোগ করতে কিছুটা দেরি হয়েছে…
ডেভিস হেরিং

উত্তর:


101

সি ++ 17 পাই পর্যন্ত অন্তর্ভুক্ত করা ভাষাটিতে ধ্রুবক হিসাবে পরিচিত হয় না এবং এটি ঘাড়ে ব্যথা।

আমি ভাগ্যবান যে আমি বুস্ট ব্যবহার করি এবং তারা পাইকে একটি বড় পরিমাণে দশমিক স্থান এমনকি 128 বিটের জন্যও সংজ্ঞা দেয় long double

আপনি যদি বুস্ট ব্যবহার না করেন তবে নিজেই হার্ডকোড করুন। এটি একটি ত্রিকোণমিতিক ক্রিয়াকলাপের সাথে সংজ্ঞায়িত করা লোভনীয় তবে আপনি যদি এটি করেন তবে আপনি এটি এটিকে তৈরি করতে পারবেন না constexpr। ট্রিগনোমেট্রিক ফাংশনগুলির যথার্থতাও আমি ( সিএফstd::sqrt) জানি এমন কোনও মানদণ্ডের দ্বারা গ্যারান্টিযুক্ত নয় , সুতরাং সত্যিকার অর্থে আপনি বিপজ্জনক স্থানে রয়েছেন যেমন এই জাতীয় ফাংশনের উপর নির্ভর করে।

ধাতব প্রোগ্রামিং ব্যবহার করে পাইয়েরconstexpr জন্য একটি মান পাওয়ার একটি উপায় রয়েছে : দেখুন http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/


সি ++ থেকে কিছু ভাল খবর। সেখানে হয় একটি defininition পাই । সি ++ ২০ এর মধ্যে কিছু গাণিতিক ধ্রুবক যুক্ত হয়েছে <numbers>। উদাহরণস্বরূপ std::numbers::piএকটি হল doubleপ্রকার।

তথ্যসূত্র: https://en.cppreferences.com/w/cpp/numeric/constants


9
@ লন্ডিন: তবে এটি constexprদুর্ভাগ্যজনক হতে পারে না , এ কারণেই আমি বলছি "ট্রিগ ফাংশন দিয়ে এটি সংজ্ঞায়িত করা একটি ব্যথা"
বাথশেবা

9
কেন এটা কোন ব্যাপার? পাই একটি ধ্রুবক, পরিবর্তনের বিষয়বস্তু বা বাস্তবায়ন-নির্দিষ্ট কিছু নয়। কেবলমাত্র (যদি আপনি চান কনস্ট অবজেক্টে) উল্লেখযোগ্য জায়গাগুলির সংখ্যায় লিখুন double(অথবা আপনি যদি হাইপোটিটিকাল সত্য-দীর্ঘ দীর্ঘ দ্বিগুণ সম্পর্কে যত্নশীল হন তবে কিছু হাস্যকর সংখ্যা)।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

10
@ আর..আর আমার যে সমস্যাটি রয়েছে তা হ'ল এটি এখন হাস্যকর বলে মনে হচ্ছে ২০ বছর বা তার মধ্যে পুরোপুরি বুদ্ধিমান হয়ে উঠতে পারে। (বিল গেটসের 640 কে স্মরণে ঝর্ণা)। আমি বুস্টকে আর্কিটেকচার বিবর্তন ধরে রাখতে বিশ্বাস করি।
বাথশেবা


10
@KonradRudolph: একটি উচ্চ স্পষ্টতা পাই বিষয় পরিসীমা-হ্রাস বাস্তবায়ন পারেন। উদাহরণস্বরূপ, x86 / x87 এর অভ্যন্তরীণ পাই ধ্রুবক (পূর্ণ -৪-বিট ম্যান্টিসা) ছোট ইনপুটগুলির জন্য "শেষ স্থানে প্রায়fsin ১. qu37 কুইন্টিলিয়ন ইউনিট , নির্দেশের চেয়ে চার বিটের চেয়ে কম রেখে" সবচেয়ে খারাপ ক্ষেত্রে ত্রুটি বাড়ে it's বৃহত্তর ইনপুটগুলির জন্য আরও খারাপ যেখানে ব্যাপ্তি-হ্রাস একাধিকবার মোড়ানো হয়। এটি long doubleসি ++ তে ব্যবহৃত ধ্রুবকের কাছে কিছুটা স্পর্শকাতর তবে যাইহোক।
পিটার কর্ডেস

31

অন্যরা যেমন বলেছে তেমন কিছুই নেই std::piতবে আপনি যদি সুনির্দিষ্ট PIমান চান তবে আপনি ব্যবহার করতে পারেন:

constexpr double pi = std::acos(-1);

এটি ধরে নেওয়া হয় যে আপনার সি ++ বাস্তবায়ন পিআই থেকে সঠিকভাবে গোলাকার মান উত্পাদন করে acos(-1.0), যা সাধারণ তবে গ্যারান্টিযুক্ত নয়

এটি নয় constexpr, তবে অনুশীলনে জিসিসি এবং ক্ল্যাংয়ের মতো সংকলককে সংকলন করার সময় এটি মূল্যায়ন করে। constঅপ্টিমাইজারের পক্ষে যদিও একটি ভাল কাজ করা গুরুত্বপূর্ণ তবে তা ঘোষণা করা ।


2
এটি বিপজ্জনক কারণ acos()ফাংশনে একটি অসীম slাল রয়েছে x = -1। ফলস্বরূপ, এই পদ্ধতিটি acos()মূলত স্পষ্টভাবে একটি সুনির্দিষ্ট -1যুক্তির কেস ধরার জন্য বাস্তবায়নের উপর নির্ভর করে এবং সরাসরি সঠিক ধ্রুবকটি ফিরিয়ে দেয়। 4*atan(1)গাণিতিকভাবে আরও দৃust় (ভালো আচরণের behaালু x = 1এবং 4 দ্বারা গুণন সর্বদা ভাসমান পয়েন্ট গণিতের সাথে যথাযথ হয়) এর মতো আরও ভাল ব্যবহার use
সিমেস্টার

1
আমাদের std::acosএকটি ধ্রুবক প্রকাশে ব্যবহার করার অনুমতি নেই । ঝাঁকুনি এটি ত্রুটি হিসাবে রিপোর্ট করে। দয়া করে নোট করুন যে এটি একটি অ-সঙ্গতিপূর্ণ এক্সটেনশন এবং শেষ পর্যন্ত এটি জিসিসিতে স্থির করা উচিত। আরও তথ্যের জন্য দয়া করে এই উত্তরটি দেখুন।
বাদোলা

31

সি ++ ২০ অবধি, না, কোনও মানই ধ্রুবকের পরিচয় দেয় না যা পাই (i) সংখ্যাটি উপস্থাপন করবে would আপনি আপনার কোডটিতে সংখ্যাটি আনুমানিক করতে পারেন:

constexpr double pi = 3.14159265358979323846;

যেমন সি # টি অন্য ভাষায় আছে ধ্রুবক তাদের লাইব্রেরি ঘোষিত।

আপডেট: সি ++ 20 দিয়ে শুরু piকরে <numbers>শিরোনামের অভ্যন্তরে অবশ্যই একটি ধ্রুবক ঘোষিত রয়েছে । এটা তোলে মাধ্যমে অ্যাক্সেস হয়: std::numbers::pi


6
আপনি inlineসি ++ 17 + এর জন্য যুক্ত করতে চাইতে পারেন ।
হস্তান্তরকারী

8
তোমাকে ধন্যবাদ। একটি উত্সাহ দিন, তবে নোট করুন যে আপনার সংজ্ঞাটি এখনও বিভিন্ন সংজ্ঞা সহ প্ল্যাটফর্মগুলির সাথে অসম্মানের জন্য ঝুঁকির মধ্যে রয়েছে doubledoubleটাইপ স্থির হওয়ার পরে সি # তে এটি সহজ easy আমি যদি সি ++ স্ট্যান্ডার্ড কমিটিতে থাকি তবে আমি এমন কিছু প্রস্তাব করতামstd::constants<double>::pi
বাথশেবা

11
@ ডুডুলিপিকেটারটিও অন্তর্নিহিতভাবে ইনলাইনও ইনটেক্সটপ্রপেক্ট নয় ...?
WHN

4
@R। যথেষ্ট ন্যায্য, যদিও আপনার std::numeric_limits<double>::is_iec559;ক্ষেত্রে স্থির থাকা উচিত । কোনটি, আমি স্বীকার করি, আমার "মাস্টার শিরোলেখ" এ আমার যা আছে। নোট করুন যে আনুষ্ঠানিকভাবে আপনাকে সমস্ত ভাসমান পয়েন্টের প্রকারগুলি আলাদাভাবে পরীক্ষা করতে হবে। একটি আইইইই 75৫৪ এর অর্থ এই নয় যে তারা সবাই।
বাথশেবা

2
@ ড্যানিয়েল শেপলার তাই, সেই "সংখ্যা" কী বলে মনে হচ্ছে? আমি জানতাম না যে 16 টি বেস সহ ডাবল সংখ্যা রয়েছে।
BЈовић

29

M_PIএকটি "একটি প্রমিত" দ্বারা সংজ্ঞায়িত করা হয়, যদি না ভাষা : মান POSIX এক্স / ওপেন সিস্টেম ইন্টারফেস এক্সটেনশানের সঙ্গে (যা খুব সাধারণভাবে সমর্থিত এবং সরকারী ইউনিক্স ব্র্যান্ডিংয়ের জন্য প্রয়োজন বোধ করা হয়)।

এটি (এখনও) নির্দিষ্ট নয় যে সি ++ তে কী হবে তবে আপনি যেহেতু জিজ্ঞাসা করেছেন: সম্ভবত এটির ধ্রুবক এটি থাকবে । কাগজটি সি ++ 20 বৈশিষ্ট্যগুলির শেষ রাউন্ডে মার্জ করা হয়েছিল (আগস্ট 2019 এর কমিটি খসড়ার জন্য)।

বিশেষত, সেখানে std::numbers::pi(টাইপের double) এবং একটি ভেরিয়েবল টেম্পলেট উভয়ই থাকবে যা আপনি যদি কোনও ভিন্ন ভাসমান পয়েন্ট প্রকার চান, তবে আপনি ব্যবহার করতে পারেন std::numbers::pi_v<float>। ধ্রুবকের সম্পূর্ণ তালিকা [সংখ্যা.সিন] এ দেখা যাবে


আপনি যেমন উপযুক্ত দেখেন তেমন আমার সম্পাদনাটির বিন্যাসে নির্দ্বিধায় - আমি কেবল উত্তরসূরির জন্য এখানে নতুন কনস্ট্যান্টগুলির আসল বানানটি যুক্ত করতে চেয়েছিলাম।
ব্যারি

12

এটি স্পষ্টতই একটি ভাল ধারণা নয় কারণ ডাইমেনগুলি জুড়ে সর্বজনীনভাবে প্রযোজ্য পাই সংজ্ঞায়িত করে এমন কোনও স্পষ্ট প্রকার নেই।

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

যেকোন প্রোগ্রামারের পক্ষে পাইয়ের মান খুঁজে পাওয়া এবং তাদের নিজস্ব ধ্রুবকটি ব্যবহারের জন্য উপযুক্ত হিসাবে সংজ্ঞায়িত করা তুচ্ছ, সুতরাং এটি গণিত শিরোনামে অন্তর্ভুক্ত করার জন্য কোনও দুর্দান্ত সুবিধা সরবরাহ করে না।


10
সি ++ 14 আমাদের পরিবর্তনশীল টেম্পলেট দিয়েছে। তারা কি জন্য তাই না?
আমালোম

21
একজন সত্যিকারের কমিটির সদস্যের মতো কথা বলা, সুস্পষ্ট পথ উপস্থাপিত হওয়া সত্ত্বেও এটি যেভাবে করা যায় না সে সম্পর্কে সমস্ত কথা বলুন। আশ্চর্যজনকভাবে প্রাসঙ্গিক উদাহরণটি পরিবর্তনশীল টেম্পলেটগুলি দেখুন । আপনার উত্তরটি খারাপ বলে আমি মনে করি না, তবে আমি নিশ্চিত যে এটি সি ++ এর ভবিষ্যতের নিয়ন্ত্রণ অত্যন্ত অনিবার্য কমিটির হাতে দেওয়ার আফসোসের কারণে বার্জন স্ট্রস্ট্রপের চিরস্থায়ী হতাশাকে সাহায্য করবে না।
WHN

4
@ এসএনবি আমি সম্মত হই যে বহুবর্ষীয় piধ্রুবক তৈরি করা হিন্দি -মিলনার ধরণের অনুক্রমের ভাষায় - একটি স্পষ্ট পথ path হাস্কেলে, আমরা সবসময়ই পেয়েছি pi :: Floating a => a, যাতে এটি piস্বয়ংক্রিয়ভাবে 3.1415927একটি Floatপ্রসঙ্গে, 3.141592653589793একটি Doubleপ্রসঙ্গে এবং πএকটি প্রতীকী-গণনার প্রসঙ্গে মান পাবে । কিন্তু লোকে কি সত্যিই টেম্পলেট প্যারামিটার স্পষ্টভাবে ইনস্ট্যান্ট করতে চান? কিছুটা বিশ্রী মনে হচ্ছে, বিশেষত যদি একটি নির্দিষ্ট long doubleপ্রয়োগ বেশিরভাগ অ্যাপ্লিকেশনগুলিতে অভিন্ন ফলাফল দেয়।
বাম দিকের বাইরে

2
@ বামফ্রন্টআউটআউট আমি বিশ্বাস করি লেখা auto a = pi<float>;সম্পূর্ণরূপে ঠিকঠাক , অবশ্যই অধিক পাঠযোগ্য এবং তখন কুখ্যাত4*atan(1)
আমোম

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

-1

সম্পাদিত - প্রয়োজনীয় শব্দটি সরানোর জন্য, কারণ এটি বিতর্কিত প্রমাণিত। এটি একটি নিখুঁত শব্দ খুব বেশি।

সি ++ একটি বৃহত এবং জটিল ভাষা, সেই কারণেই স্ট্যান্ডার্ড কমিটি কেবল এমন জিনিসগুলিকে অন্তর্ভুক্ত করে যা দৃ strongly়ভাবে প্রয়োজনীয় । যতটা সম্ভব বাকী ভাষাবিহীন স্ট্যান্ডার্ড লাইব্রেরিগুলিতে ছেড়ে যায় ... বুস্টের মতো।
অনুমোদন :: গণিত :: ধ্রুবক


29
নিশ্চিত, std::hermiteএবং std::cyl_bessel_iএবং std::coshএবং std::mersenne_twister_engineএবং std::ranlux48এবং std::cauchy_distributionএবং std::assoc_laguerreএবং std::betaসব অত্যাবশ্যক হত, তাহলে আমরা তাদের যে প্রতিদিন ব্যবহার!
Amomum

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

আমার কাছে কোন অভিযোগ করবেন না, আমি শুধু স্ট্যান্ডার্ড কমিটির উদ্ধৃতি দিচ্ছি। C ++ 11 স্ট্যান্ডার্ডে কতটা বাড়াতে হবে সে সম্পর্কে দীর্ঘ আলোচনা ছিল open সংক্ষিপ্ত লেখকরা কতটা পরীক্ষার সাথে জড়িত ছিলেন সে সম্পর্কে অভিযোগ করেছিলেন কারণ এত ছোট একটি উপসেট এটি তৈরি করার কারণ। অতএব, যদি কিছু মানদণ্ডে থাকে তবে এটি সেখানে রয়েছে কারণ কেউ এটিকে মানক করা প্রয়োজন বলে মনে করেছিলেন। আপনি কেন জানেন না কেবল কারণ এর কোনও কারণ নেই doesn't
টাইগার

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

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