Introduceert C++11, 14, 17 of 20 een standaardconstante voor pi?

Er is een nogal dom probleem met het getal pi in C en C++. Voor zover ik weet is M_PIgedefinieerd in math.hdoor geen enkele norm vereist.

Nieuwe C++-standaarden introduceerden veel gecompliceerde wiskunde in de standaardbibliotheek – hyperbolische functies, std::hermiteen std::cyl_bessel_i, verschillende generatoren voor willekeurige getallen en zo enzovoort.

Heeft een van de ‘nieuwe’ standaarden een constante voor pi opgeleverd? Zo niet – waarom? Hoe werkt al deze ingewikkelde wiskunde zonder?

Ik ben op de hoogte van soortgelijke vragen over pi in C++ (ze zijn enkele jaren en standaarden oud); Ik zou graag de huidige status van het probleem willen weten.

Ik ben ook erg geïnteresseerd in waarom oh waaromC++ heeft nog steeds geen pi-constante, maar heeft veel meer gecompliceerde wiskunde.

Ik weet dat ik pi zelf kan definiëren als 4*atan(1)of acos(-1)of double pi = 3.14;. Zeker wel. Maar waarom moet ik het dan nog doen? Hoe werken standaard wiskundige functies zonder pi?


Antwoord 1, autoriteit 100%

Tot en met C++17 piis geen constante die in de taal wordt geïntroduceerd en het is een pijn in de nek.

Ik heb het geluk dat ik boostgebruik en ze definiëren pimet een voldoende groot aantal decimalen voor zelfs een 128-bits long double.

Als je Boost niet gebruikt, moet je het zelf hardcoderen. Het definiëren met een trigonometrische functie is verleidelijk, maar als je dat doet, kun je er geen constexprvan maken. De nauwkeurigheid van de trigonometrische functies wordt ook niet gegarandeerd door enige standaard die ik ken (cf. std::sqrt), dus u bevindt zich echt op gevaarlijk terrein en vertrouwt inderdaad op dergelijke een functie.

Er is een manier om een ​​constexpr-waarde voor pite krijgen met behulp van metaprogrammering: zie http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/


Vanuit C++20 goed nieuws. Er is iseen definitie voor pi. C++20 voegt enkele wiskundige constanten toe in <numbers>. std::numbers::piis bijvoorbeeld een doubletype.

Referentie: https://en.cppreference.com/w/cpp/numeric/ constanten


Antwoord 2, autoriteit 30%

Tot C++20, nee, geen van de standaarden introduceerde de constante die het getal zou vertegenwoordigen pi(?). U kunt het aantal in uw code benaderen:

constexpr double pi = 3.14159265358979323846;

Andere talen zoals C# hebbende constante gedeclareerd in hun bibliotheken.

Bijwerken:
Beginnend met C++20, is er inderdaad een PIconstante gedeclareerd in de <numbers>header. Het is toegankelijk via: std::numbers::pi.


Antwoord 3, autoriteit 27%

Zoals anderen al zeiden, is er geen std::pi, maar als je een exacte PI-waarde wilt, kun je het volgende gebruiken:

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

Hierbij wordt ervan uitgegaan dat uw C++-implementatie een correct afgeronde waarde van PI produceert van acos(-1.0), wat gebruikelijk is, maar niet gegarandeerd.

Het is niet constexpr, maar in de praktijk evalueren het optimaliseren van compilers zoals gcc en clang het tijdens het compileren. Het verklaren van het constis echter belangrijk voor de optimizer om goed werk te leveren.


Antwoord 4, autoriteit 25%

M_PIwordt gedefinieerd door “een standaard”, zo niet een taalstandaard: POSIXmet de X/Open System Interfaces-extensie (die zeer algemeen wordt ondersteund en vereist voor officiële UNIX-branding).

C++20 heeft ondertussen wel dergelijke constanten(samengevoegd in de laatste ronde van C++20-functies). In het bijzonder is er zowel std::numbers::pi(van het type double) als een variabele sjabloon die u kunt gebruiken als u een ander type met drijvende komma wilt, b.v. std::numbers::pi_v<float>.


Antwoord 5, autoriteit 10%

Het is natuurlijk geen goed idee omdat er geen duidelijk type is waarmee pi wordt gedefinieerd dat universeel toepasbaar is op alle domeinen.

Pi is natuurlijk een irrationeel getal, dus het kan niet correct worden weergegeven door elkC++-type. Je zou kunnen stellen dat de natuurlijke benadering daarom is om het te definiëren in het grootste beschikbare drijvende-kommatype. De grootte van het grootste standaard drijvende-kommatype long doublewordt echter niet gedefinieerd door de C++-standaard, dus de waarde van de constante kan per systeem verschillen. Erger nog, voor elk programma waarin het werktype niet dit grootste type was, zou de definitie van pi ongepast zijn, omdat het prestatiekosten zou opleggen aan elk gebruik van pi.

Het is ook triviaal voor elke programmeur om de waarde van pi te vinden en zijn eigen constante te definiëren die geschikt is voor gebruik, dus het biedt geen groot voordeel om het in de wiskundekoppen op te nemen.


Antwoord 6

Bewerkt – Om de term te verwijderen die nodig was, omdat deze controversieel bleek te zijn. Het is een te absolute term.

C++ is een grote en complexe taal, daarom neemt de Standards Committee alleen zaken op die sterk vereist. Er wordt zoveel mogelijk overgelaten aan niet-talige standaardbibliotheken… zoals Boost.
boost: :math::constanten

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eight + 20 =

Other episodes