std::ellint...d::ellint_2l(3)
π NAME
std::ellint_2, std::ellint_2f, std::ellint_2l β literally those three, that's the whole name, no notes π«Ά
Okay so real talk, this is the C++ Standard Libary manual page (yes bestie, that's how the header spells it, I'm not fixing it π), and the page title is std::ellint...d::ellint_2l(3) β that's the truncated version of the whole std::ellint_2 / std::ellint_2f / std::ellint_2l situation. C++17 math special functions era. Stay with me π¦
β¨ SYNOPSIS β¨
Defined in header <cmath>:
float ellint_2 ( float k, float phi );
double ellint_2 ( double k, double phi );
long double ellint_2 ( long double k, long double phi );
/* floating-point-type */ ellint_2( /* floating-point-type */ k,
/* floating-point-type */ phi );
float ellint_2f( float k, float phi );
long double ellint_2l( long double k, long double phi );
Here's the deets on which one landed when π
(1)β theellint_2crew. Thefloatone is(since C++17), thedoubleone is(until C++23), and the/* floating-point-type */overload is(since C++23).(2)βellint_2f,(since C++17).(3)βellint_2l,(since C++17).
Then there's the additional overloads situation π«
Defined in header <cmath>
template< class Arithmetic1, class Arithmetic2 >
/* common-floating-point-type */
ellint_2( Arithmetic1 k, Arithmetic2 phi );
(A)β these extra overloads are(since C++17).
So what do 1β3 actually do? They compute the incomplete elliptic integral of the second kind of k and phi. Iconic.
And <pink>since C++23</pink>, the library provides overloads of std::ellint_2 for all cv-unqualified floating-point types as the type of the parameters k and phi. Slay.
(A) is your safety net: additional overloads are provided for all other combinations of arithmetic types. No cap.
π PARAMETERS π
kβ elliptic modulus or eccentricity (a floating-point or integer value)phiβ Jacobi amplitude (a floating-point or integer value, measured in radians β do not come at me with degrees, bestie π)
π₯ RETURN VALUE π₯
If no errors occur, you get the value of the incomplete elliptic integral of the second kind of k and phi, that is:
β« from 0 to phi of β(1-kΒ² sinΒ²ΞΈ) dΞΈ
That's the one. The math ate, fr fr π
π ERROR HANDLING π
Errors may be reported as specified in math_errhandling:
- If the argument is
NaN,NaNis returned and domain error is not reported. - If
|k|>1, a domain error may occur.
β οΈ That |k|>1 one is your vibe check β it may blow up on you, so don't act surprised.
π¦ NOTES π¦
Implementations that don't support C++17 but do support ISO 29124:2010 provide this function if __STDCPP_MATH_SPEC_FUNCS__ is defined by the implementation to a value at least 201003L, and if the user defines __STDCPP_WANT_MATH_SPEC_FUNCS__ before including any standard library headers. (Yes, that's a lot of underscores. Yes, you have to get them exactly right. π)
Implementations that don't support ISO 29124:2010 but do support TR 19768:2007 (TR1) provide this function in the header tr1/cmath and namespace std::tr1.
An implementation of this function is also available in boost.math. Options, bestie πΈ
Here's the part everyone skips but shouldn't: the additional overloads are not required to be provided exactly as (A). They only need to be sufficient to ensure that, for their first argument num1 and second argument num2:
- If
num1ornum2has typelong double, thenstd::ellint2(num1, num2)has the same effect asstd::ellint2(static_cast<long double>(num1), static_cast<long double>(num2)). - Otherwise, if
num1and/ornum2has typedoubleor an integer type, thenstd::ellint2(num1, num2)has the same effect asstd::ellint2(static_cast<double>(num1), static_cast<double>(num2)). β(until C++23) - Otherwise, if
num1ornum2has typefloat, thenstd::ellint2(num1, num2)has the same effect asstd::ellint2(static_cast<float>(num1), static_cast<float>(num2)).
If num1 and num2 have arithmetic types, then std::ellint2(num1, num2) has the same effect as std::ellint2(static_cast</* common-floating-point-type */>(num1), static_cast</* common-floating-point-type */>(num2)), where /* common-floating-point-type */ is the floating-point type with the greatest floating-point conversion rank and greatest floating-point conversion subrank between the types of num1 and num2. (since C++23) β and arguments of integer type are considered to have the same floating-point conversion rank as double.
And the plot twist: if no such floating-point type with the greatest rank and subrank exists, then overload resolution does not result in a usable candidate from the overloads provided. π Overload resolution said "not today."
πΈ EXAMPLE πΈ
// Run this code
#include <cmath>
#include <iostream>
#include <numbers>
int main()
{
const double hpi = std::numbers::pi / 2.0;
std::cout << "E(0,Ο/2) = " << std::ellint_2(0, hpi) << '\n'
<< "E(0,-Ο/2) = " << std::ellint_2(0, -hpi) << '\n'
<< "Ο/2 = " << hpi << '\n'
<< "E(0.7,0) = " << std::ellint_2(0.7, 0) << '\n'
<< "E(1,Ο/2) = " << std::ellint_2(1, hpi) << '\n';
}
π OUTPUT π
E(0,Ο/2) = 1.5708
E(0,-Ο/2) = -1.5708
Ο/2 = 1.5708
E(0.7,0) = 0
E(1,Ο/2) = 1
Look at that symmetry. The way E(0,Ο/2) and E(0,-Ο/2) are literally mirror images π beautiful.
π SEE ALSO π
comp_ellint_2comp_ellint_2fcomp_ellint_2lβ (complete) elliptic integral of the second kind,(function),(C++17),(C++17),(C++17)
Not me pointing you at the complete version when you came here for the incomplete one β but go off, they're siblings π«Ά
π EXTERNAL LINKS π
Weisstein, Eric W. "Elliptic Integral of the Second Kind." From MathWorld β A Wolfram Web Resource.
That's the whole page, bestie. Source and version: http://cppreference.com, 2024.06.10, and the page signs off as std::ellint...d::ellint_2l(3) β go forth and integrate elliptically β¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms