std::cos,st...f,std::cosl(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME

std::cos, std::cosf, std::cosl β€” bestie, this is the cosine function from the C++ Standard Library (that's the <cmath> crew, we love them) πŸŽ€


✨ SYNOPSIS

okay so first things first, everything here lives in the header <cmath>:

Defined in header <cmath>
float       cos ( float num );

double      cos ( double num );                            (until C++23)

long double cos ( long double num );
/* floating-point-type */                                  (since C++23)
                cos ( /* floating-point-type */ num );         (constexpr since C++26)
float       cosf( float num );                     (1) (2) (since C++11)
                                                                   (constexpr since C++26)
long double cosl( long double num );                   (3) (since C++11)
                                                                   (constexpr since C++26)
Additional overloads (since C++11)
Defined in header <cmath>
template< class Integer >                              (A) (constexpr since C++26)
double      cos ( Integer num );

So like, breaking it down for you 🌸:

  • 1-3) Computes the cosine of num (measured in radians). Like, actual radians, not degrees, we're not doing that today πŸ’…
  • Since C++23, the library provides overloads of std::cos for all cv-unqualified floating-point types as the type of the parameter. Slay.
  • A) Additional overloads are provided for all integer types (since C++11), and those get treated as double.

πŸŽ€ PARAMETERS

  • num β€” a floating-point or integer value representing an angle in radians πŸ¦‹

🌸 RETURN VALUE

If no errors occur, you get the cosine of num (that's cos(num)) in the range [-1.0, +1.0]. Iconic range tbh πŸ‘‘

until C++11: heads up bestie β€” the result may have little or no significance if the magnitude of num is large. Like, don't come crying to me πŸ™ˆ

If a domain error occurs, an implementation-defined value is returned (NaN where supported).

If a range error occurs due to underflow, the correct result (after rounding) is returned. Good for it.


πŸ¦‹ ERROR HANDLING

Errors are reported as specified in math_errhandling. fr fr, go read that one too.

If the implementation supports IEEE floating-point arithmetic (IEC 60559), then:

  • if the argument is Β±0, the result is 1.0 ✨
  • if the argument is ±∞, NaN is returned and FE_INVALID is raised πŸ’€
  • if the argument is NaN, NaN is returned (garbage in, garbage out, no cap)

πŸ’… NOTES

The case where the argument is infinite is not specified to be a domain error in C β€” but it is defined as a domain error in POSIX. So like, C is chill about it and POSIX is not. Pick your fighter 🫢

The additional overloads are not required to be provided exactly as (A). They only need to be sufficient to ensure that for their argument num of integer type, std::cos(num) has the same effect as std::cos(static_cast<double>(num)). That's the whole vibe check, nothing more required 🌈


πŸ”₯ EXAMPLE

go ahead, run it, I'll wait πŸ“

// Run this code

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <numbers>

// #pragma STDC FENV_ACCESS ON

constexpr double pi = std::numbers::pi; // or std::acos(-1) before C++20

constexpr double your_cos(double x)
{
    double cos{1}, pow{x};
    for (auto fac{1ull}, n{1ull}; n != 19; fac *= ++n, pow *= x)
        if ((n & 1) == 0)
            cos += (n & 2 ? -pow : pow) / fac;
    return cos;
}

int main()
{
    std::cout << std::setprecision(10) << std::showpos
              << "Typical usage:\n"
              << "std::cos(pi/3) = " << std::cos(pi / 3) << '\n'
              << "your cos(pi/3) = " << your_cos(pi / 3) << '\n'
              << "std::cos(pi/2) = " << std::cos(pi / 2) << '\n'
              << "your cos(pi/2) = " << your_cos(pi / 2) << '\n'
              << "std::cos(-3*pi/4) = " << std::cos(-3 * pi / 4) << '\n'
              << "your cos(-3*pi/4) = " << your_cos(-3 * pi / 4) << '\n'
              << "Special values:\n"
              << "std::cos(+0) = " << std::cos(0.0) << '\n'
              << "std::cos(-0) = " << std::cos(-0.0) << '\n';

    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);

    std::cout << "cos(INFINITY) = " << std::cos(INFINITY) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "    FE_INVALID raised\n";
}

πŸ“ POSSIBLE OUTPUT

Typical usage:
std::cos(pi/3) = +0.5
your cos(pi/3) = +0.5
std::cos(pi/2) = +6.123233996e-17
your cos(pi/2) = -3.373452105e-15
std::cos(-3*pi/4) = -0.7071067812
your cos(-3*pi/4) = -0.7071067812
Special values:
std::cos(+0) = +1
std::cos(-0) = +1
cos(INFINITY) = -nan
    FE_INVALID raised

not the +6.123233996e-17 for pi/2 😭 that's the floating-point representation of zero being a little dramatic, love that for us


🌈 SEE ALSO

the whole trig family, they're all in the group chat πŸ’œ

  • sin, sinf (C++11), sinl (C++11) β€” computes sine (sin(x)) (function) πŸ¦‹
  • tan, tanf (C++11), tanl (C++11) β€” computes tangent (tan(x)) (function) πŸ”₯
  • acos, acosf (C++11), acosl (C++11) β€” computes arc cosine (arccos(x)) (function) 🌸
  • cos(std::complex) β€” computes cosine of a complex number (cos(z)) (function template) πŸ‘‘
  • cos(std::valarray) β€” applies the function std::cos to each element of valarray (function template) ⭐
  • C documentation for cos β€” yes there's a C one too, go off πŸ’…

and that's the page, bestie!! πŸŽ€βœ¨ this one came from cppreference.com, version 2024.06.10 β€” mwah, thanks for reading, go compute some cosines πŸ’–πŸ«Ά

πŸ“¦ where this page comes from