Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/numeric/math/erfc"

From cppreference.com
< cpp‎ | numeric‎ | math
m (Return value)
m (.)
 
(3 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
{{cpp/title|erfc|erfcf|erfcl}}
 
{{cpp/title|erfc|erfcf|erfcl}}
 
{{cpp/numeric/math/navbar}}
 
{{cpp/numeric/math/navbar}}
{{dcl begin}}
+
{{cpp/numeric/math/declarations
{{dcl header | cmath}}
+
|family=erfc
{{dcl | since=c++11 |num=1|
+
|param1=num
float      erfc ( float arg );
+
|constexpr_since=26
float      erfcf( float arg );
+
|desc=Computes the {{enwiki|Complementary error function|complementary error function}} of {{c|num}}, that is {{c|1.0 - std::erf(num)}}, but without loss of precision for large {{c|num}}.
 
}}
 
}}
{{dcl | since=c++11 |num=2|
 
double      erfc ( double arg );
 
}}
 
{{dcl | since=c++11 |num=3|
 
long double erfc ( long double arg );
 
long double erfcl( long double arg );
 
}}
 
{{dcl | since=c++11 |num=4|
 
double      erfc ( IntegralType arg );
 
}}
 
{{dcl end}}
 
 
@1-3@ Computes the [[enwiki:Complementary error function|complementary error function]] of {{tt|arg}}, that is {{tt|1.0-erf(arg)}}, but without loss of precision for large {{tt|arg}}
 
@4@ A set of overloads or a function template accepting an argument of any [[cpp/types/is_integral|integral type]]. Equivalent to {{v|2}} (the argument is cast to {{c|double}}).
 
  
 
===Parameters===
 
===Parameters===
 
{{par begin}}
 
{{par begin}}
{{par | arg | value of a floating-point or [[cpp/types/is_integral|integral type]]}}
+
{{par|num|floating-point or integer value}}
 
{{par end}}
 
{{par end}}
  
 
===Return value===
 
===Return value===
If no errors occur, value of the complementary error function of {{tt|arg}}, that is {{mathjax-or|\(\frac{2}{\sqrt{\pi} }\int_{arg}^{\infty}{e^{-{t^2} }\mathsf{d}t}\)|{{mfrac|2|{{mrad|&pi;}}}}{{minteg|arg|∞|{{mexp|-t{{su|p=2}}}}d''t''}}}} or {{mathjax-or|\({\small 1-\operatorname{erf}(arg)}\)|1-erf(arg)}}, is returned.
+
If no errors occur, value of the complementary error function of {{c|num}}, that is {{mathjax-or|\(\frac{2}{\sqrt{\pi} }\int_{num}^{\infty}{e^{-{t^2} }\mathsf{d}t}\)|{{mfrac|2|{{mrad|&pi;}}}}{{minteg|num|∞|{{mexp|-t{{su|p=2}}}}d''t''}}}} or {{mathjax-or|\({\small 1-\operatorname{erf}(num)}\)|1-erf(num)}}, is returned.
  
If a range error occurs due to underflow, the correct result (after rounding) is returned
+
If a range error occurs due to underflow, the correct result (after rounding) is returned.
  
 
===Error handling===
 
===Error handling===
Line 36: Line 22:
  
 
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
 
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
* If the argument is +∞, +0 is returned
+
* If the argument is +∞, +0 is returned.
* If the argument is -∞, 2 is returned
+
* If the argument is -∞, 2 is returned.
* If the argument is NaN, NaN is returned
+
* If the argument is NaN, NaN is returned.
  
 
===Notes===
 
===Notes===
For the IEEE-compatible type {{tt|double}}, underflow is guaranteed if {{tt|arg}} > 26.55.
+
For the IEEE-compatible type {{c/core|double}}, underflow is guaranteed if {{c|num > 26.55}}.
 +
 
 +
{{cpp/numeric/math/additional integer overload note|erfc}}
  
 
===Example===
 
===Example===
{{example|code=
+
{{example
#include <iostream>
+
|code=
 
#include <cmath>
 
#include <cmath>
 
#include <iomanip>
 
#include <iomanip>
 +
#include <iostream>
 +
 
double normalCDF(double x) // Phi(-∞, x) aka N(x)
 
double normalCDF(double x) // Phi(-∞, x) aka N(x)
 
{
 
{
     return std::erfc(-x/std::sqrt(2))/2;
+
     return std::erfc(-x / std::sqrt(2)) / 2;
 
}
 
}
 +
 
int main()
 
int main()
 
{
 
{
 
     std::cout << "normal cumulative distribution function:\n"
 
     std::cout << "normal cumulative distribution function:\n"
 
               << std::fixed << std::setprecision(2);
 
               << std::fixed << std::setprecision(2);
     for(double n=0; n<1; n+=0.1)
+
     for (double n = 0; n < 1; n += 0.1)
         std::cout << "normalCDF(" << n << ") " << 100*normalCDF(n) << "%\n";
+
         std::cout << "normalCDF(" << n << ") = " << 100 * normalCDF(n) << "%\n";
 
+
   
 
     std::cout << "special values:\n"
 
     std::cout << "special values:\n"
 
               << "erfc(-Inf) = " << std::erfc(-INFINITY) << '\n'
 
               << "erfc(-Inf) = " << std::erfc(-INFINITY) << '\n'
Line 65: Line 56:
 
|output=
 
|output=
 
normal cumulative distribution function:
 
normal cumulative distribution function:
normalCDF(0.00) 50.00%
+
normalCDF(0.00) = 50.00%
normalCDF(0.10) 53.98%
+
normalCDF(0.10) = 53.98%
normalCDF(0.20) 57.93%
+
normalCDF(0.20) = 57.93%
normalCDF(0.30) 61.79%
+
normalCDF(0.30) = 61.79%
normalCDF(0.40) 65.54%
+
normalCDF(0.40) = 65.54%
normalCDF(0.50) 69.15%
+
normalCDF(0.50) = 69.15%
normalCDF(0.60) 72.57%
+
normalCDF(0.60) = 72.57%
normalCDF(0.70) 75.80%
+
normalCDF(0.70) = 75.80%
normalCDF(0.80) 78.81%
+
normalCDF(0.80) = 78.81%
normalCDF(0.90) 81.59%
+
normalCDF(0.90) = 81.59%
normalCDF(1.00) 84.13%
+
normalCDF(1.00) = 84.13%
 
special values:
 
special values:
 
erfc(-Inf) = 2.00
 
erfc(-Inf) = 2.00
Line 83: Line 74:
 
===See also===
 
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc inc | cpp/numeric/math/dsc erf}}
+
{{dsc inc|cpp/numeric/math/dsc erf}}
{{dsc see c | c/numeric/math/erfc}}
+
{{dsc see c|c/numeric/math/erfc}}
 
{{dsc end}}
 
{{dsc end}}
  
 
===External links===
 
===External links===
[http://mathworld.wolfram.com/Erfc.html Weisstein, Eric W. "Erfc."] From MathWorld--A Wolfram Web Resource.
+
{{eli|[https://mathworld.wolfram.com/Erfc.html Weisstein, Eric W. "Erfc."] From MathWorld &mdash; A Wolfram Web Resource.}}
  
 
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}
 
{{langlinks|de|es|fr|it|ja|pt|ru|zh}}

Latest revision as of 21:24, 15 October 2023

 
 
 
 
Defined in header <cmath>
(1)
float       erfc ( float num );

double      erfc ( double num );

long double erfc ( long double num );
(until C++23)
/* floating-point-type */
            erfc ( /* floating-point-type */ num );
(since C++23)
(constexpr since C++26)
float       erfcf( float num );
(2) (since C++11)
(constexpr since C++26)
long double erfcl( long double num );
(3) (since C++11)
(constexpr since C++26)
Additional overloads (since C++11)
Defined in header <cmath>
template< class Integer >
double      erfc ( Integer num );
(A) (constexpr since C++26)
1-3) Computes the complementary error function of num, that is 1.0 - std::erf(num), but without loss of precision for large num. The library provides overloads of std::erfc for all cv-unqualified floating-point types as the type of the parameter.(since C++23)
A) Additional overloads are provided for all integer types, which are treated as double.
(since C++11)

Contents

[edit] Parameters

num - floating-point or integer value

[edit] Return value

If no errors occur, value of the complementary error function of num, that is
2
π
∞nume-t2dt
or 1-erf(num), is returned.

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

[edit] Error handling

Errors are reported as specified in math_errhandling.

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

  • If the argument is +∞, +0 is returned.
  • If the argument is -∞, 2 is returned.
  • If the argument is NaN, NaN is returned.

[edit] Notes

For the IEEE-compatible type double, underflow is guaranteed if num > 26.55.

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::erfc(num) has the same effect as std::erfc(static_cast<double>(num)).

[edit] Example

#include <cmath>
#include <iomanip>
#include <iostream>
 
double normalCDF(double x) // Phi(-∞, x) aka N(x)
{
    return std::erfc(-x / std::sqrt(2)) / 2;
}
 
int main()
{
    std::cout << "normal cumulative distribution function:\n"
              << std::fixed << std::setprecision(2);
    for (double n = 0; n < 1; n += 0.1)
        std::cout << "normalCDF(" << n << ") = " << 100 * normalCDF(n) << "%\n";
 
    std::cout << "special values:\n"
              << "erfc(-Inf) = " << std::erfc(-INFINITY) << '\n'
              << "erfc(Inf) = " << std::erfc(INFINITY) << '\n';
}

Output:

normal cumulative distribution function:
normalCDF(0.00) = 50.00%
normalCDF(0.10) = 53.98%
normalCDF(0.20) = 57.93%
normalCDF(0.30) = 61.79%
normalCDF(0.40) = 65.54%
normalCDF(0.50) = 69.15%
normalCDF(0.60) = 72.57%
normalCDF(0.70) = 75.80%
normalCDF(0.80) = 78.81%
normalCDF(0.90) = 81.59%
normalCDF(1.00) = 84.13%
special values:
erfc(-Inf) = 2.00
erfc(Inf) = 0.00

[edit] See also

(C++11)(C++11)(C++11)
error function
(function) [edit]

[edit] External links

Weisstein, Eric W. "Erfc." From MathWorld — A Wolfram Web Resource.