সি ++ এ পিআই ধ্রুবকটি কীভাবে ব্যবহার করবেন


476

আমি কিছু সি ++ প্রোগ্রামে পিআই ধ্রুবক এবং ত্রিকোনমিতি ফাংশন ব্যবহার করতে চাই। আমি এর সাথে ত্রিকোণমিতিক ফাংশন পাই include <math.h>। যাইহোক, এই শিরোলেখ ফাইলটিতে পিআইয়ের কোনও সংজ্ঞা বলে মনে হচ্ছে না।

আমি নিজেই এটির সংজ্ঞা না দিয়ে কীভাবে পিআই পেতে পারি?


3
@tiwo, আপনি জিজ্ঞাসা করা হয় মধ্যে পার্থক্য কি 3.14, 3.141592এবং atan(1) * 4?
নিকোলা মালেসিভিć

21
পার্শ্ব নোট হিসাবে, cmath ম্যাথ h এর পরিবর্তে সি ++ ব্যবহার করা উচিত, যা সি এর জন্য রয়েছে
juzzlin

4
শিথিলভাবে সম্পর্কিত: কীভাবে সংজ্ঞা থেকে সরাসরি পিআইয়ের মান গণনা করতে হয় তা সম্পর্কে cise.ufl.edu/~manuel/obfuscate/pi.c দেখুন ।
লোরো

উত্তর:


537

কিছু (বিশেষত পুরানো) প্ল্যাটফর্মগুলিতে (নীচের মন্তব্যগুলি দেখুন) আপনার প্রয়োজন হতে পারে

#define _USE_MATH_DEFINES

এবং তারপরে প্রয়োজনীয় হেডার ফাইলটি অন্তর্ভুক্ত করুন:

#include <math.h>

এবং পাইয়ের মান এর মাধ্যমে অ্যাক্সেস করা যায়:

M_PI

আমার math.h(2014) এ এটি সংজ্ঞায়িত করা হয়েছে:

# define M_PI           3.14159265358979323846  /* pi */

তবে math.hআরও জন্য আপনার পরীক্ষা করুন । "পুরাতন" থেকে একটি নিষ্কাশন math.h(২০০৯ সালে):

/* Define _USE_MATH_DEFINES before including math.h to expose these macro
 * definitions for common math constants.  These are placed under an #ifdef
 * since these commonly-defined names are not part of the C/C++ standards.
 */

যাহোক:

  1. নতুন প্ল্যাটফর্মগুলিতে (কমপক্ষে আমার 64 বিট উবুন্টু 14.04 এ) আমার সংজ্ঞা দেওয়ার দরকার নেই _USE_MATH_DEFINES

  2. (সাম্প্রতিক) লিনাক্স প্ল্যাটফর্মগুলিতে long doubleজিএনইউ এক্সটেনশন হিসাবে সরবরাহ করা মানগুলি রয়েছে:

    # define M_PIl          3.141592653589793238462643383279502884L /* pi */

51
#define _USE_MATH_DEFINESদ্বারা অনুসরণ #include <math.h>সংজ্ঞায়িত M_PIচাক্ষুষ C ++। ধন্যবাদ।
এটান

3
পাশাপাশি সাইগউইন শিরোনামের সাথে কাজ করে।
রব

24
আপনি সর্বদা এর cmathপরিবর্তে অন্তর্ভুক্ত করতে পারেন math.h
রিচার্ড জে রস তৃতীয়

10
সংজ্ঞায়িত হওয়ার পরেও _USE_MATH_DEFINESযদি জিসিসি অভিযোগ করে যে কারণ __STRICT_ANSI__এটি সংজ্ঞায়িত হয়েছে (সম্ভবত আপনি পাস করেছেন -pedanticবা -std=c++11) যা M_PIসংজ্ঞায়িত করতে অস্বীকার করে, সুতরাং এটির সাথে এটি সংজ্ঞায়িত করুন -D__STRICT_ANSI__। এটি নিজেকে সংজ্ঞায়িত করার সময় এটি যেহেতু এটি ম্যাক্রোর পরিবর্তে সি ++ হয় constexpr auto M_PI = 3.14159265358979323846;
কিংবদন্তি 2 কে

1
2018 হিসাবে, উত্তরটি <math.h> এর পরিবর্তে <cmath> ব্যবহারের জন্য সংজ্ঞায়িতভাবে আপডেট করা উচিত
jaskmar

170

পাই হিসাবে গণনা করা যেতে পারে atan(1)*4। আপনি এইভাবে মানটি গণনা করতে এবং এটি ক্যাশে করতে পারেন।


78
সি ++ 11 ব্যবহারকারীর জন্য:constexpr double pi() { return std::atan(1)*4; }
মাটিউ

41
-1: কেবলমাত্র atan(1)*4 == 3.141592653589793238462643383279502884(মোটামুটি কথা বললে) কাজ করে। আমি তাতে বাজি ধরব না। ধ্রুবকটি সংজ্ঞায়িত করতে সাধারণ হন এবং কাঁচা আক্ষরিক ব্যবহার করুন। আপনার প্রয়োজন নেই যখন কেন নির্ভুলতা হারাবেন?
টমাস এডিং

29
যার সাহায্যে গুন অপারেশন এড়ানো যায় atan2(0, -1);
কিংবদন্তি

44
@ মতিউ atanনেই constexpr
আর মার্টিনহো ফার্নান্দেস

45
acos(-1)পরিবর্তে চেষ্টা করুন, প্রয়োজন নেই atan2
ব্যবহারকারী541686

113

আপনি বুস্টটিও ব্যবহার করতে পারেন যা অনুরোধিত ধরণের (যেমন ফ্লোট বনাম ডাবল) সর্বাধিক নির্ভুলতার সাথে গুরুত্বপূর্ণ গণিতের ধ্রুবককে সংজ্ঞায়িত করে।

const double pi = boost::math::constants::pi<double>();

পরীক্ষা করে দেখুন বুস্ট ডকুমেন্টেশন আরো উদাহরণ জন্য।


184
বুস্ট করুন: ১৯৯৯ সাল থেকে সি ++ এর ইতিমধ্যে অপ্রয়োজনীয় জটিলতা বাড়ানো হচ্ছে!
ড্যান মোল্ডিং

47
আকর্ষণীয় এবং আংশিক সত্য। অন্যদিকে
উত্সাহটি

59
@ ড্যানমোল্ডিং: উহম। আপনি কি জানেন এমন একমাত্র ভাষা সি? কারণ সি ছাড়া অন্যান্য সমস্ত ভাষাগুলির একটি স্ট্যান্ডার্ড লাইব্রেরি রয়েছে যা সি ++ 'এর চেয়ে বড় আকারের (যেমন পাইথন, হাস্কেল, সি #, পিএইচপি, ডেলফি, এরলং, জাভা, ......)। ব্যক্তিগত অভিজ্ঞতা থেকে, সেই অভিজাত not gonna use libs-পিনিয়ন একটি পোকা এবং সম্ভবত সি ++ এ লেখা খারাপ সফ্টওয়্যারটির এক নম্বর কারণ।
সেবাস্তিয়ান মাচ

11
@ গ্রেচাস: হ্যাঁ সি ++ লাইব্রেরি ছাড়াই (বা নতুন সি ++ 11 লাইব্রেরি ছাড়া), আমি যতটা ভাষা পছন্দ করি এবং যতটা আমি নিজেই কোডিং করতে চাই, খুব উত্পাদনশীল নয়।
সেবাস্তিয়ান মাচ

14
আমি বিশ্বাস করি তিনি বলেছিলেন জটিলতা আকার নয় । সম্ভবত ক) 3 টি নেস্টেড নেমস্পেসগুলি উল্লেখ করে এবং খ) পাইকে কেবল একটি সাধারণ ধ্রুবক না করে টেম্প্লেটেড ফাংশন হিসাবে সংজ্ঞায়িত করে।
টিএমএমএম

83

পরিবর্তে চিপ এফপিইউ ইউনিট থেকে এটি পান:

double get_PI()
{
    double pi;
    __asm
    {
        fldpi
        fstp pi
    }
    return pi;
}

double PI = get_PI();

40
:-) সম্ভবত সেই প্ল্যাটফর্মটি স্বাধীন নয়, তবে একটি দুর্দান্ত অতিরিক্ত বহিরাগত সমাধান!
এটান

3
আমি আপনাকে এখানে কীভাবে বক্সের বাইরে রেখে
দিচ্ছি তা পছন্দ করি

1
আমি এই উত্তর ভালবাসি। পুরানো x86 প্ল্যাটফর্মগুলি টার্গেট করার সময় এটি কার্যকরভাবে কার্যকর হয় যেটি অপেক্ষাকৃত কমপ্লায়াররা আধুনিকগুলির মতো মারাত্মকভাবে জড়িত না এমন দেরিতে একটি ছোট ফ্যাড। এই হেনরিকের জন্য ধন্যবাদ!
ম্যাট

49

আপনার প্রয়োজনীয় নির্ভুলতার জন্য আমি কেবল পাই টাইপ করার পরামর্শ দেব। এটি আপনার মৃত্যুদন্ডে কোনও গণনার সময় যোগ করবে না এবং এটি কোনও শিরোনাম বা # নির্দিষ্টকরণ ব্যবহার না করে পোর্টেবল হবে। অ্যাকোস বা আতান গণনা করা প্রাক-গণনাকারী মান ব্যবহারের চেয়ে সর্বদা ব্যয়বহুল।

const double PI  =3.141592653589793238463;
const float  PI_F=3.14159265358979f;

28
এটি আমাদের পক্ষে কেন এই দৃষ্টিভঙ্গি গ্রহণ করা উচিত নয়, এটি একটি দুর্দান্ত উদাহরণ, আমরা লোকেরা ভুল করি, গোল করি, অনুলিপি করি এবং আটকানো ইত্যাদি I
nacho4d

10
এক সি ++ 11 এই কাজ করা হয়, তাহলে করতে constএকটি constexpr
কিংবদন্তি 2 কে

3
@ nacho4d আমিও যদি এমপিআইআই উপলব্ধ থাকে তবে এটি পছন্দ করি তবে সমস্ত সিস্টেমই পসিক্সের অনুগত নয়। আমি মনে করি যে ক্ষেত্রে এমএপিআই পাওয়া যায় না তার ক্ষেত্রে 4 * আতান (1) পদ্ধতির চেয়ে এই পদ্ধতির চেয়ে ভাল।
m24p

2
"অ্যাকোস বা আতান গণনা করা সবসময়ই বেশি ব্যয়বহুল" সত্য নয়। যে কোনও আধুনিক অনুকূলকরণ সংস্থাপক স্ট্যান্ডার্ড গণিতের কার্যাদি সম্পর্কে সমস্ত কিছু জানেন এবং তাদের মাধ্যমে ধ্রুবক প্রচার করতে পারেন। উদাহরণস্বরূপ goo.gl/BvdJyr
নিমো

2
@ নেমো, কাউন্টার উদাহরণ: Godbolt.org/g/DsAern যেমন অন্য কোথাও বলা হয়েছে, এটি কেবলমাত্র জিসিসি বর্তমানে এটি করে এবং সম্ভবত এটি সম্ভবত গণিতের কাজগুলি ঘোষণা করেছে বলেই মনে হয় constexpr
পার্কার কোটস

47

লেখার চেয়ে

#define _USE_MATH_DEFINES

আমি আপনার সংকলক ব্যবহার -D_USE_MATH_DEFINESবা /D_USE_MATH_DEFINESনির্ভর করে সুপারিশ করব ।

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


ভালো পরামর্শ. যদি "আপনি" একটি সংকলন ইউনিট হন তবে অবশ্যই নিশ্চিত করতে পারেন যে কোনও কিছু অন্তর্ভুক্ত করার আগে ম্যাক্রো সংজ্ঞায়িত হয়েছে। তবে "আপনি" যদি একটি শিরোনাম ফাইল হন তবে এটি আপনার নিয়ন্ত্রণের বাইরে।
স্টিভ জেসোপ

3
আসলে "আপনি" একটি সংকলন ইউনিট হলেও ... শিরোনামের ক্রম অনুসারে রক্ষণাবেক্ষণের দুঃস্বপ্নের দিকে সবচেয়ে ছোটতম পথ ...
ম্যাথিউ এম।

1
যদিও আপনাকে শিরোনামের ক্রমটির উপর নির্ভর করতে হবে না। শিরোনাম একে অপরের অন্তর্ভুক্ত কিনা তা বিবেচনাধীন নয়, শর্তিত যে আপনি কিছু অন্তর্ভুক্ত করার আগে # নির্ধারিত কাজটি করেছেন (কমপক্ষে, ধরে নিবেন যে এটি কোনও কিছুই # অন্তর্ভুক্ত করে না)। একই এনডিইবিউজে প্রযোজ্য।
স্টিভ জেসোপ

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

40

যেহেতু অফিসিয়াল স্ট্যান্ডার্ড লাইব্রেরি একটি ধ্রুবক পিআই সংজ্ঞায়িত করে না তাই আপনাকে এটি নিজেরাই সংজ্ঞা দিতে হবে। সুতরাং আপনার প্রশ্নের উত্তর "আমি নিজেই এটির সংজ্ঞা না দিয়ে কীভাবে পিআই পেতে পারি?" "আপনি না - বা আপনি কিছু সংকলক-নির্দিষ্ট এক্সটেনশনের উপর নির্ভর করেন। আপনি যদি বহনযোগ্যতার বিষয়ে উদ্বিগ্ন না হন তবে আপনি এটির জন্য আপনার সংকলকের ম্যানুয়ালটি পরীক্ষা করতে পারেন।

সি ++ আপনাকে লেখার অনুমতি দেয়

const double PI = std::atan(1.0)*4;

তবে এই ধ্রুবকটির সূচনা স্থির হওয়ার গ্যারান্টিযুক্ত নয়। জি ++ সংকলক তবে সেই গণিতের ফাংশনগুলিকে অন্তঃসত্ত্ব হিসাবে পরিচালনা করে এবং সংকলন-সময়ে এই ধ্রুবক প্রকাশটি গণনা করতে সক্ষম।


6
আমি সাধারণত অ্যাকোস (-1) ব্যবহার করি, যেমন আপনি বলেছেন, সেগুলি সংকলন-সময় মূল্যায়ন করা হয়। আমি যখন M_PI, acos (-1) এবং অতন (1) * 4 পরীক্ষা করলাম তখন আমি অভিন্ন মান পেয়েছি।
মাইকা

2
ঐতিহ্যগত ভাবে ব্যবহার করা 4*atan(1.): atanবাস্তবায়ন করা সহজ এবং 4 দ্বারা গুন একটি সঠিক অপারেশন। অবশ্যই, আধুনিক সংকলকগুলি প্রয়োজনীয় স্থিতিশীলতার সাথে সমস্ত ধ্রুবকগুলি ভাঁজ করে (ভাঁজ করা লক্ষ্য) এবং এটি ব্যবহার করা পুরোপুরি যুক্তিযুক্ত acos(-1)বা এটি std::abs(std::arg(std::complex<double>(-1.,0.)))যা ইউলারের সূত্রের বিপরীত এবং এইভাবে মনে হয় তার চেয়ে আরও নান্দনিকভাবে আনন্দদায়ক হয় (আমি যুক্ত করেছি absকারণ আমি ডোন না ' কীভাবে জটিল প্লেনটি কাটা হয় বা এটি যদি সংজ্ঞায়িত করা হয় তবে তা মনে রাখবেন না)।
tobi_s

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

32

থেকে math.h এর Posix man পৃষ্ঠা :

   The  <math.h>  header  shall  provide for the following constants.  The
   values are of type double and are accurate within the precision of  the
   double type.

   M_PI   Value of pi

   M_PI_2 Value of pi/2

   M_PI_4 Value of pi/4

   M_1_PI Value of 1/pi

   M_2_PI Value of 2/pi

   M_2_SQRTPI
          Value of 2/ sqrt pi

3
ভাল উত্তর তবে লিঙ্কটি মারা গেছে। আমি পরিবর্তে এটি একটি পরামর্শ ।
আবদাররহিম কিতোনি

30

সি ++ 20 std::numbers::pi

শেষ অবধি , এটি পৌঁছেছে: http://eel.is/c++ ড্রাফ্ট / নাম্বার

আমি আশা করি ব্যবহারটি এর মতো হবে:

#include <numbers>
#include <iostream>

int main() {
    std::cout << std::numbers::pi << std::endl;
}

সমর্থনটি জিসিসি, জিসিসি 9.1.0 এ পৌঁছানোর g++-9 -std=c++2aপরেও এটি ব্যবহার না করে চেষ্টা করব।

অনুমোদিত প্রস্তাব বর্ণনা করে:

5.0। "শিরোনাম" [শিরোলেখ] সারণীতে [ট্যাব: cpp.library.headers], একটি নতুন <math>শিরোনাম যুক্ত করা দরকার।

[...]

namespace std {
namespace math { 
  template<typename T > inline constexpr T pi_v = unspecified;
    inline constexpr double pi = pi_v<double>;

std::numbers::eঅবশ্যই একটি কোর্স রয়েছে :-) সি ++ এ চালিত ইউলার ধ্রুবক বা ইউরার গণনা কিভাবে করবেন?

এই ধ্রুবকগুলি C ++ 14 ভেরিয়েবল টেম্পলেট বৈশিষ্ট্যটি ব্যবহার করে: C ++ 14 ভেরিয়েবল টেম্পলেট: তাদের উদ্দেশ্য কী? কোন ব্যবহারের উদাহরণ?

খসড়াটির পূর্ববর্তী সংস্করণগুলিতে ধ্রুবকটি ছিল std::math::pi: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0631r7.pdf


27

স্ট্যান্ডার্ড সি ++ পিআইয়ের জন্য একটি ধ্রুবক নেই।

অনেক সি ++ সংকলক একটি মানহীন এক্সটেনশন হিসাবে (বা সি এর জন্য) সংজ্ঞায়িত M_PIকরে । আপনি করতে হতে পারে আগে আপনি এটা দেখতে পারেন।cmathmath.h#define _USE_MATH_DEFINES


18

আমি করবো

template<typename T>
T const pi = std::acos(-T(1));

অথবা

template<typename T>
T const pi = std::arg(-std::log(T(2)));

আপনার প্রয়োজনীয় নির্ভুলতার জন্য আমি টাইপ করব না । এর মানে কী? আপনার যে নির্ভুলতাটি প্রয়োজন তা হ'ল যথার্থতা , তবে আমরা কিছুই জানি নাTT

আপনি বলতে পারেন: আপনি কি সম্পর্কে কথা বলছেন? Tহবে float, doubleবা long double। সুতরাং, ঠিক নির্ভুলতা টাইপ করুন long double, মানে

template<typename T>
T const pi = static_cast<T>(/* long double precision π */);

তবে আপনি কি সত্যিই জানেন যে ভবিষ্যতে স্ট্যান্ডার্ডে কোনও নতুন ভাসমান পয়েন্ট টাইপ হবে না এর চেয়ে আরও উচ্চতর নির্ভুলতার সাথে long double ? আপনি না।

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

এবং দয়া করে, এটি বলবেন না যে আরম্ভের সময় ত্রিকোণমিতিক ফাংশনের মূল্যায়ন একটি পারফরম্যান্স পেনাল্টি।


1
arg(log(x)) == πসবার জন্য নোট করুন 0 < x < 1
0xbadf00d

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

10

আমি প্রকল্পটিতে আমার সাধারণ শিরোনামের একটিতে নিম্নলিখিতটি ব্যবহার করি যা সমস্ত ঘাঁটিটি কভার করে:

#define _USE_MATH_DEFINES
#include <cmath>

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

#ifndef M_PIl
#define M_PIl (3.14159265358979323846264338327950288)
#endif

পার্শ্ব নোটে, নীচের সমস্ত সংকলকগুলি যদি আপনি অন্তর্ভুক্ত করেন তবে M_PI এবং M_PIl ধ্রুবককে সংজ্ঞায়িত করে <cmath>। এখানে কেবলমাত্র ভিসি ++ এর জন্য প্রয়োজনীয় `# ডিফাইন _USE_MATH_DEFINES যুক্ত করার দরকার নেই।

x86 GCC 4.4+
ARM GCC 4.5+
x86 Clang 3.0+

এই উত্তরের সাথে কী ভুল তা সম্পর্কে ডাউনভোটার মন্তব্য করতে পারেন। এটি ভাল গবেষণা এবং পরীক্ষিত এবং বাস্তব সিস্টেমে ব্যবহৃত হচ্ছে। আমি কিছু ভুল হলে অবশ্যই এটি উন্নত করতে চাই।
শীতল শাহ

1
এফওয়াইআই, বোরল্যান্ড সি ++ M_PI_USE_MATH_DEFINES
সংকলকগুলিও

8

আমি সাধারণত আমার নিজের সংজ্ঞা দিতে পছন্দ করি: const double PI = 2*acos(0.0); কারণ সমস্ত বাস্তবায়ন এটি আপনার জন্য সরবরাহ করে না।

এই ফাংশনটি রানটাইমের সময় ডেকে আনে বা সংকলনের সময় স্থির হয় কিনা এই প্রশ্নটি সাধারণত সমস্যা নয়, কারণ এটি কেবল একবারে হয় happens


8
acos (-1) এছাড়াও পাই।
রডারিক টেলর

3
এটি মেমরির অবস্থান থেকে অপারেন্ড পড়ার চেয়ে তাত্ক্ষণিক অপারেণ্ড লোড করার জন্য প্রায়শই কম সিপিইউ নির্দেশিকা এবং / অথবা কম বিলম্ব হয়। এছাড়াও, সংকলন-সময় পরিচিত কেবলমাত্র প্রকাশগুলিই প্রাক-গণনা করা যেতে পারে (আমার অর্থ double x = pi * 1.5;এবং এর মতো)। যদি আপনি কখনও টাইট লুপগুলিতে ক্রাঙ্কি ম্যাথে পিআই ব্যবহার করার পরিকল্পনা করেন তবে আপনি আরও ভাল করে নিশ্চিত করে নিন যে মানটি সংকলকটির কাছে জানা আছে।
ইউজিন রায়বটসেভ

7

আমি শুধু জুড়ে এসেছিল এই নিবন্ধটি দ্বারা ড্যানি Kalev যা সি ++ 14 এবং আপ জন্য একটি মহান টিপ হয়েছে।

template<typename T>
constexpr T pi = T(3.1415926535897932385);

আমি ভেবেছিলাম এটি দুর্দান্ত ছিল (যদিও আমি সেখানে যাচ্ছিলাম সেখানে সর্বোচ্চ নির্ভুলতা পিআই ব্যবহার করব), বিশেষত কারণ টেমপ্লেটগুলি টাইপের উপর ভিত্তি করে এটি ব্যবহার করতে পারে।

template<typename T>
T circular_area(T r) {
  return pi<T> * r * r;
}
double darea= circular_area(5.5);//uses pi<double>
float farea= circular_area(5.5f);//uses pi<float>

4

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

#include <ratio>
#include <iostream>

template<typename RATIO>
constexpr double dpipart()
{
    long double const pi = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899863;
    return static_cast<double>(pi * RATIO::num / RATIO::den);
}

int main()
{
    std::cout << dpipart<std::ratio<-1, 6>>() << std::endl;
}

2
খুব সুন্দর. এই সংখ্যার শেষে "এল" বা "এল" থাকা দরকার। আমি লিনাক্সে আমার সংকলক জিসিসি থেকে সংকীর্ণ সতর্কতা পেয়েছি।
গ্রান্ট রোস্টিগ

2

উইন্ডোজে (সাইগউইন + জি ++), আমি -D_XOPEN_SOURCE=500প্রিপ্রসেসরটির M_PIইন- এর সংজ্ঞা প্রক্রিয়া করার জন্য পতাকা যুক্ত করার প্রয়োজন খুঁজে পেয়েছি math.h


2
এটি কোনও উত্তর নয়, তবে ফ্রিজটোনর উত্তরের মন্তব্য।
0xbadf00d

2
@ 0xbadf00d: এটি একটি সম্পূর্ণ স্ট্যান্ডেলোন উত্তর যা M_PIকোনও নির্দিষ্ট প্ল্যাটফর্মে কাজ করার জন্য প্রয়োজনীয় পদক্ষেপ সরবরাহ করে । এটি অন্য কোনও প্ল্যাটফর্মের আর কোনও উত্তরের জন্য মন্তব্য নয় যে অন্য কোনও প্ল্যাটফর্মের উত্তর এটির বিষয়ে একটি মন্তব্য।
বেন ভয়েগট

2

সি ++ 14 আপনাকে করতে দেয় static constexpr auto pi = acos(-1);


9
std::acosএকটি না constexpr। সুতরাং, আপনার কোড সংকলন করবে না।
0xbadf00d

@ 0xbadf00d আমি এটিকে g ++ দিয়ে সংকলিত করেছি
উইলি ছাগল

12
@WillyGoat তারপর গ্রাম ++, ভুল, কারণ acosনয় constexprসি ++ 14, এবং পরিণত প্রস্তাবিত নয় constexpr++, 17 সি এমনকি
বেন Voigt

@ BenVoigt- তে কোনও গণিতের কাজ রয়েছে কি constexpr? দৃশ্যত না: stackoverflow.com/questions/17347935/constexpr-math-functions
wcochran

1
@ ডাব্লুচোচরান: প্রচুর পরিমাণে নতুন গণিত কার্য রয়েছে যা constexprউদাহরণস্বরূপ দেখুন ( github.com/kthohr/gcem )। তবে তারা একই নামের সি ফাংশনের সাথে পিছিয়ে-সামঞ্জস্যপূর্ণ নয়, তাই তারা পুরানো নামগুলি ধরে নিতে পারে না।
বেন ভয়েগট

2

কিছু মার্জিত সমাধান। আমি সন্দেহ করি যে ত্রিকোণমিতিক কার্যগুলির যথার্থতা যদিও প্রকারের নির্ভুলতার সমান। যারা ধ্রুবক মান লিখতে পছন্দ করেন তাদের ক্ষেত্রে এটি g ++:

template<class T>
class X {
public:
            static constexpr T PI = (T) 3.14159265358979323846264338327950288419\
71693993751058209749445923078164062862089986280348253421170679821480865132823066\
47093844609550582231725359408128481117450284102701938521105559644622948954930381\
964428810975665933446128475648233786783165271201909145648566923460;
...
}

256 দশমিক অঙ্কের নির্ভুলতা যে কোনও ভবিষ্যতের দীর্ঘ দীর্ঘ দীর্ঘ ডাবল ধরণের জন্য যথেষ্ট হওয়া উচিত। আরো দর্শন প্রয়োজন হয় https://www.piday.org/million/



1

তুমি এটি করতে পারো:

#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

যদি M_PIইতিমধ্যে সংজ্ঞায়িত করা হয় তবে এটি cmathঅন্তর্ভুক্ত করা ছাড়া আর কিছুই করবে না cmath। যদি M_PIসংজ্ঞায়িত না হয় (যা ভিজ্যুয়াল স্টুডিওতে উদাহরণস্বরূপ এটি হয়), এটি এটি সংজ্ঞায়িত করবে। উভয় ক্ষেত্রেই, আপনি M_PIপাই এর মান পেতে ব্যবহার করতে পারেন ।

পাইটির এই মানটি কিউটি ক্রিয়েটারের qmath.h থেকে আসে।


1

আপনি এটি ব্যবহার করতে পারেন:

#define _USE_MATH_DEFINES // for C++
#include <cmath>

#define _USE_MATH_DEFINES // for C
#include <math.h>

গণিত ধ্রুবকগুলি স্ট্যান্ডার্ড সি / সি ++ এ সংজ্ঞায়িত করা হয় না। এগুলি ব্যবহার করতে, আপনাকে অবশ্যই প্রথমে সংজ্ঞায়িত করতে হবে _USE_MATH_DEFINESএবং তারপরে অন্তর্ভুক্ত করতে হবে cmathবা math.h

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