Difference between revisions of "c/numeric/complex"
m (imaginary type macro moved to Types, and the complex unit constant i moved to The imaginary constant) |
m (fmt.) |
||
(25 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
{{title|Complex number arithmetic}} | {{title|Complex number arithmetic}} | ||
{{c/numeric/complex/navbar}} | {{c/numeric/complex/navbar}} | ||
+ | {{rrev|since=c11| | ||
+ | If the macro constant {{tt|__STDC_NO_COMPLEX__}} is defined by the implementation, the complex types, the header {{tt|<complex.h>}} and all of the names listed here are not provided.}} | ||
− | The header {{tt|<complex.h>}} | + | The C programming language, as of C99, supports complex number math with the three built-in types {{c|double _Complex}}, {{c|float _Complex}}, and {{c|long double _Complex}} (see {{ltt|c/keyword/_Complex}}). When the header {{tt|<complex.h>}} is included, the three complex number types are also accessible as {{c|double complex}}, {{c|float complex}}, {{c|long double complex}}. |
− | + | In addition to the complex types, the three imaginary types may be supported: {{c|double _Imaginary}}, {{c|float _Imaginary}}, and {{c|long double _Imaginary}} (see {{ltt|c/keyword/_Imaginary}}). When the header {{tt|<complex.h>}} is included, the three imaginary types are also accessible as {{c|double imaginary}}, {{c|float imaginary}}, and {{c|long double imaginary}}. | |
− | Standard arithmetic operators {{c|+, -, *, /}} can be used with real, complex, and imaginary types in any combination. | + | Standard arithmetic operators {{c|+}}, {{c|-}}, {{c|*}}, {{c|/}} can be used with real, complex, and imaginary types in any combination. <!--TODO: link to the arithmetic operators, don't forget cx limited range and the details from G.5.1 and G.5.2. in their description --> |
− | + | {{rrev multi|since1=c99|rev1= | |
− | + | A compiler that defines {{tt|__STDC_IEC_559_COMPLEX__}} is recommended, but not required to support imaginary numbers. POSIX recommends checking if the macro {{lc|_Imaginary_I}} is defined to identify imaginary number support. | |
− | + | |since2=c11|rev2= | |
+ | Imaginary numbers are supported if {{tt|__STDC_IEC_559_COMPLEX__}} {{rev inl|since=c23|or {{tt|__STDC_IEC_60559_COMPLEX__}}}} is defined. | ||
+ | }} | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc header | complex.h}} | + | {{dsc header|complex.h}} |
− | {{dsc h2 | Types}} | + | {{dsc h2|Types}} |
− | {{dsc inc | c/numeric/complex/dsc imaginary}} | + | {{dsc inc|c/numeric/complex/dsc imaginary}} |
− | {{dsc inc | c/numeric/complex/dsc complex}} | + | {{dsc inc|c/numeric/complex/dsc complex}} |
− | {{dsc h2 | The imaginary constant}} | + | {{dsc h2|The imaginary constant}} |
− | {{dsc inc | c/numeric/complex/dsc Imaginary_I}} | + | {{dsc inc|c/numeric/complex/dsc Imaginary_I}} |
− | {{dsc inc | c/numeric/complex/dsc Complex_I}} | + | {{dsc inc|c/numeric/complex/dsc Complex_I}} |
− | {{dsc inc | c/numeric/complex/dsc I}} | + | {{dsc inc|c/numeric/complex/dsc I}} |
− | {{dsc h2 | Manipulation}} | + | {{dsc h2|Manipulation}} |
− | {{dsc inc | c/numeric/complex/dsc CMPLX}} | + | {{dsc inc|c/numeric/complex/dsc CMPLX}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc creal}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc cimag}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc cabs}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc carg}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc conj}} |
− | {{dsc inc | c/numeric/complex/dsc | + | {{dsc inc|c/numeric/complex/dsc cproj}} |
− | {{dsc h2 | Exponential functions}} | + | {{dsc h2|Exponential functions}} |
− | {{dsc inc | c/numeric/complex/dsc cexp}} | + | {{dsc inc|c/numeric/complex/dsc cexp}} |
− | {{dsc inc | c/numeric/complex/dsc clog}} | + | {{dsc inc|c/numeric/complex/dsc clog}} |
− | {{dsc h2 | Power functions}} | + | {{dsc h2|Power functions}} |
− | {{dsc inc | c/numeric/complex/dsc cpow}} | + | {{dsc inc|c/numeric/complex/dsc cpow}} |
− | {{dsc inc | c/numeric/complex/dsc csqrt}} | + | {{dsc inc|c/numeric/complex/dsc csqrt}} |
− | {{dsc h2 | Trigonometric functions}} | + | {{dsc h2|Trigonometric functions}} |
− | {{dsc inc | c/numeric/complex/dsc csin}} | + | {{dsc inc|c/numeric/complex/dsc csin}} |
− | {{dsc inc | c/numeric/complex/dsc ccos}} | + | {{dsc inc|c/numeric/complex/dsc ccos}} |
− | {{dsc inc | c/numeric/complex/dsc ctan}} | + | {{dsc inc|c/numeric/complex/dsc ctan}} |
− | {{dsc inc | c/numeric/complex/dsc casin}} | + | {{dsc inc|c/numeric/complex/dsc casin}} |
− | {{dsc inc | c/numeric/complex/dsc cacos}} | + | {{dsc inc|c/numeric/complex/dsc cacos}} |
− | {{dsc inc | c/numeric/complex/dsc catan}} | + | {{dsc inc|c/numeric/complex/dsc catan}} |
− | {{dsc h2 | Hyperbolic functions}} | + | {{dsc h2|Hyperbolic functions}} |
− | {{dsc inc | c/numeric/complex/dsc csinh}} | + | {{dsc inc|c/numeric/complex/dsc csinh}} |
− | {{dsc inc | c/numeric/complex/dsc ccosh}} | + | {{dsc inc|c/numeric/complex/dsc ccosh}} |
− | {{dsc inc | c/numeric/complex/dsc ctanh}} | + | {{dsc inc|c/numeric/complex/dsc ctanh}} |
− | {{dsc inc | c/numeric/complex/dsc casinh}} | + | {{dsc inc|c/numeric/complex/dsc casinh}} |
− | {{dsc inc | c/numeric/complex/dsc cacosh}} | + | {{dsc inc|c/numeric/complex/dsc cacosh}} |
− | {{dsc inc | c/numeric/complex/dsc catanh}} | + | {{dsc inc|c/numeric/complex/dsc catanh}} |
{{dsc end}} | {{dsc end}} | ||
===Notes=== | ===Notes=== | ||
+ | The following function names are {{rev inl|since=c23|potentially}} reserved for future addition to {{tt|complex.h}} and are not available for use in the programs that include that header: {{lc|cerf}}, {{lc|cerfc}}, {{lc|cexp2}}, {{lc|cexpm1}}, {{lc|clog10}}, {{lc|clog1p}}, {{lc|clog2}}, {{lc|clgamma}}, {{lc|ctgamma}}{{rev inl|since=c23|, {{lc|csinpi}}, {{lc|ccospi}}, {{lc|ctanpi}}, {{lc|casinpi}}, {{lc|cacospi}}, {{lc|catanpi}}, {{lc|ccompoundn}}, {{lc|cpown}}, {{lc|cpowr}}, {{lc|crootn}}, {{lc|crsqrt}}, {{lc|cexp10m1}}, {{lc|cexp10}}, {{lc|cexp2m1}}, {{lc|clog10p1}}, {{lc|clog2p1}}, {{lc|clogp1}}}}, along with their -{{tt|f}} and -{{tt|l}} suffixed variants. | ||
+ | |||
Although the C standard names the inverse hyperbolics with "complex arc hyperbolic sine" etc., the inverse functions of the hyperbolic functions are the area functions. Their argument is the area of a hyperbolic sector, not an arc. The correct names are "complex inverse hyperbolic sine" etc. Some authors use "complex area hyperbolic sine" etc. | Although the C standard names the inverse hyperbolics with "complex arc hyperbolic sine" etc., the inverse functions of the hyperbolic functions are the area functions. Their argument is the area of a hyperbolic sector, not an arc. The correct names are "complex inverse hyperbolic sine" etc. Some authors use "complex area hyperbolic sine" etc. | ||
+ | |||
+ | A complex or imaginary number is infinite if one of its parts is infinite, even if the other part is NaN. | ||
+ | |||
+ | A complex or imaginary number is finite if both parts are neither infinities nor NaNs. | ||
+ | |||
+ | A complex or imaginary number is a zero if both parts are positive or negative zeroes. | ||
+ | |||
+ | While MSVC does provide a [https://learn.microsoft.com/en-us/cpp/c-runtime-library/complex-math-support {{tt|<complex.h>}}] header, it does not implement complex numbers as native types, but as {{c|struct}}s, which are incompatible with standard C complex types and do not support the {{c|+}}, {{c|-}}, {{c|*}}, {{c|/}} operators. | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
− | + | ||
− | + | ||
#include <complex.h> | #include <complex.h> | ||
+ | #include <stdio.h> | ||
+ | #include <tgmath.h> | ||
int main(void) | int main(void) | ||
{ | { | ||
− | + | double complex z1 = I * I; // imaginary unit squared | |
− | + | printf("I * I = %.1f%+.1fi\n", creal(z1), cimag(z1)); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | double complex z2 = pow(I, 2); // imaginary unit squared | |
− | printf("% | + | printf("pow(I, 2) = %.1f%+.1fi\n", creal(z2), cimag(z2)); |
− | + | ||
− | + | double PI = acos(-1); | |
− | + | double complex z3 = exp(I * PI); // Euler's formula | |
− | + | printf("exp(I*PI) = %.1f%+.1fi\n", creal(z3), cimag(z3)); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | printf(" | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | double complex z4 = 1 + 2 * I, z5 = 1 - 2 * I; // conjugates | |
− | + | printf("(1+2i)*(1-2i) = %.1f%+.1fi\n", creal(z4 * z5), cimag(z4 * z5)); | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | |output= | |
− | + | I * I = -1.0+0.0i | |
− | + | pow(I, 2) = -1.0+0.0i | |
− | + | exp(I*PI) = -1.0+0.0i | |
− | + | (1+2i)*(1-2i) = 5.0+0.0i | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | 0 | + | |
− | -1.0+0.0i | + | |
− | -1.0+0.0i | + | |
− | + | ||
}} | }} | ||
− | + | ===References=== | |
− | + | {{ref std c23}} | |
− | + | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_NO_COMPLEX__}}|p=TBD}} | |
− | + | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_IEC_559_COMPLEX__}}|p=TBD}} | |
− | + | {{ref std|section=7.3|title=Complex arithmetic {{tt|<complex.h>}}|p=TBD}} | |
− | + | {{ref std|section=7.25|title=Type-generic math {{tt|<tgmath.h>}}|p=TBD}} | |
− | + | {{ref std|section=7.31.1|title=Complex arithmetic {{tt|<complex.h>}}|p=TBD}} | |
− | + | {{ref std|section=Annex G (normative)|title=IEC 60559-compatible complex arithmetic|p=TBD}} | |
+ | {{ref std end}} | ||
+ | {{ref std c17}} | ||
+ | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_NO_COMPLEX__}}|p=128}} | ||
+ | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_IEC_559_COMPLEX__}}|p=128}} | ||
+ | {{ref std|section=7.3|title=Complex arithmetic {{tt|<complex.h>}}|p=136-144}} | ||
+ | {{ref std|section=7.25|title=Type-generic math {{tt|<tgmath.h>}}|p=272-273}} | ||
+ | {{ref std|section=7.31.1|title=Complex arithmetic {{tt|<complex.h>}}|p=391}} | ||
+ | {{ref std|section=Annex G (normative)|title=IEC 60559-compatible complex arithmetic|p=469-479}} | ||
+ | {{ref std end}} | ||
+ | {{ref std c11}} | ||
+ | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_NO_COMPLEX__}}|p=177}} | ||
+ | {{ref std|section=6.10.8.3/1/2|title={{tt|__STDC_IEC_559_COMPLEX__}}|p=177}} | ||
+ | {{ref std|section=7.3|title=Complex arithmetic {{tt|<complex.h>}}|p=188-199}} | ||
+ | {{ref std|section=7.25|title=Type-generic math {{tt|<tgmath.h>}}|p=373-375}} | ||
+ | {{ref std|section=7.31.1|title=Complex arithmetic {{tt|<complex.h>}}|p=455}} | ||
+ | {{ref std|section=Annex G (normative)|title=IEC 60559-compatible complex arithmetic|p=532-545}} | ||
+ | {{ref std end}} | ||
+ | {{ref std c99}} | ||
+ | {{ref std|section=6.10.8/2|title={{tt|__STDC_IEC_559_COMPLEX__}}|p=161}} | ||
+ | {{ref std|section=7.3|title=Complex arithmetic {{tt|<complex.h>}}|p=170-180}} | ||
+ | {{ref std|section=7.22|title=Type-generic math {{tt|<tgmath.h>}}|p=335-337}} | ||
+ | {{ref std|section=7.26.1|title=Complex arithmetic {{tt|<complex.h>}}|p=401}} | ||
+ | {{ref std|section=Annex G (informative)|title=IEC 60559-compatible complex arithmetic|p=467-480}} | ||
+ | {{ref std end}} | ||
+ | |||
+ | ===See also=== | ||
+ | {{dsc begin}} | ||
+ | {{dsc see cpp|cpp/numeric/complex|Complex number arithmetic|nomono=true}} | ||
+ | {{dsc end}} | ||
+ | |||
+ | {{langlinks|ar|cs|de|es|fr|it|ja|ko|pl|pt|ru|tr|zh}} |
Latest revision as of 12:35, 1 February 2024
If the macro constant |
(since C11) |
The C programming language, as of C99, supports complex number math with the three built-in types double _Complex, float _Complex, and long double _Complex (see _Complex). When the header <complex.h>
is included, the three complex number types are also accessible as double complex, float complex, long double complex.
In addition to the complex types, the three imaginary types may be supported: double _Imaginary, float _Imaginary, and long double _Imaginary (see _Imaginary). When the header <complex.h>
is included, the three imaginary types are also accessible as double imaginary, float imaginary, and long double imaginary.
Standard arithmetic operators +, -, *, / can be used with real, complex, and imaginary types in any combination.
A compiler that defines |
(since C99) (until C11) |
Imaginary numbers are supported if |
(since C11) |
Defined in header
<complex.h> | ||
Types | ||
(C99) |
imaginary type macro (keyword macro) | |
(C99) |
complex type macro (keyword macro) | |
The imaginary constant | ||
(C99) |
the imaginary unit constant i (macro constant) | |
(C99) |
the complex unit constant i (macro constant) | |
(C99) |
the complex or imaginary unit constant i (macro constant) | |
Manipulation | ||
(C11)(C11)(C11) |
constructs a complex number from real and imaginary parts (function macro) | |
(C99)(C99)(C99) |
computes the real part of a complex number (function) | |
(C99)(C99)(C99) |
computes the imaginary part a complex number (function) | |
(C99)(C99)(C99) |
computes the magnitude of a complex number (function) | |
(C99)(C99)(C99) |
computes the phase angle of a complex number (function) | |
(C99)(C99)(C99) |
computes the complex conjugate (function) | |
(C99)(C99)(C99) |
computes the projection on Riemann sphere (function) | |
Exponential functions | ||
(C99)(C99)(C99) |
computes the complex base-e exponential (function) | |
(C99)(C99)(C99) |
computes the complex natural logarithm (function) | |
Power functions | ||
(C99)(C99)(C99) |
computes the complex power function (function) | |
(C99)(C99)(C99) |
computes the complex square root (function) | |
Trigonometric functions | ||
(C99)(C99)(C99) |
computes the complex sine (function) | |
(C99)(C99)(C99) |
computes the complex cosine (function) | |
(C99)(C99)(C99) |
computes the complex tangent (function) | |
(C99)(C99)(C99) |
computes the complex arc sine (function) | |
(C99)(C99)(C99) |
computes the complex arc cosine (function) | |
(C99)(C99)(C99) |
computes the complex arc tangent (function) | |
Hyperbolic functions | ||
(C99)(C99)(C99) |
computes the complex hyperbolic sine (function) | |
(C99)(C99)(C99) |
computes the complex hyperbolic cosine (function) | |
(C99)(C99)(C99) |
computes the complex hyperbolic tangent (function) | |
(C99)(C99)(C99) |
computes the complex arc hyperbolic sine (function) | |
(C99)(C99)(C99) |
computes the complex arc hyperbolic cosine (function) | |
(C99)(C99)(C99) |
computes the complex arc hyperbolic tangent (function) |
[edit] Notes
The following function names are potentially(since C23) reserved for future addition to complex.h
and are not available for use in the programs that include that header: cerf, cerfc, cexp2, cexpm1, clog10, clog1p, clog2, clgamma, ctgamma, csinpi, ccospi, ctanpi, casinpi, cacospi, catanpi, ccompoundn, cpown, cpowr, crootn, crsqrt, cexp10m1, cexp10, cexp2m1, clog10p1, clog2p1, clogp1(since C23), along with their -f
and -l
suffixed variants.
Although the C standard names the inverse hyperbolics with "complex arc hyperbolic sine" etc., the inverse functions of the hyperbolic functions are the area functions. Their argument is the area of a hyperbolic sector, not an arc. The correct names are "complex inverse hyperbolic sine" etc. Some authors use "complex area hyperbolic sine" etc.
A complex or imaginary number is infinite if one of its parts is infinite, even if the other part is NaN.
A complex or imaginary number is finite if both parts are neither infinities nor NaNs.
A complex or imaginary number is a zero if both parts are positive or negative zeroes.
While MSVC does provide a <complex.h>
header, it does not implement complex numbers as native types, but as structs, which are incompatible with standard C complex types and do not support the +, -, *, / operators.
[edit] Example
#include <complex.h> #include <stdio.h> #include <tgmath.h> int main(void) { double complex z1 = I * I; // imaginary unit squared printf("I * I = %.1f%+.1fi\n", creal(z1), cimag(z1)); double complex z2 = pow(I, 2); // imaginary unit squared printf("pow(I, 2) = %.1f%+.1fi\n", creal(z2), cimag(z2)); double PI = acos(-1); double complex z3 = exp(I * PI); // Euler's formula printf("exp(I*PI) = %.1f%+.1fi\n", creal(z3), cimag(z3)); double complex z4 = 1 + 2 * I, z5 = 1 - 2 * I; // conjugates printf("(1+2i)*(1-2i) = %.1f%+.1fi\n", creal(z4 * z5), cimag(z4 * z5)); }
Output:
I * I = -1.0+0.0i pow(I, 2) = -1.0+0.0i exp(I*PI) = -1.0+0.0i (1+2i)*(1-2i) = 5.0+0.0i
[edit] References
- C23 standard (ISO/IEC 9899:2024):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(p: TBD)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(p: TBD)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(p: TBD)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(p: TBD)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(p: TBD)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(p: 128)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(p: 128)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(p: 136-144)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(p: 272-273)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(p: 391)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: 469-479)
- C11 standard (ISO/IEC 9899:2011):
- 6.10.8.3/1/2
__STDC_NO_COMPLEX__
(p: 177)
- 6.10.8.3/1/2
- 6.10.8.3/1/2
__STDC_IEC_559_COMPLEX__
(p: 177)
- 6.10.8.3/1/2
- 7.3 Complex arithmetic
<complex.h>
(p: 188-199)
- 7.3 Complex arithmetic
- 7.25 Type-generic math
<tgmath.h>
(p: 373-375)
- 7.25 Type-generic math
- 7.31.1 Complex arithmetic
<complex.h>
(p: 455)
- 7.31.1 Complex arithmetic
- Annex G (normative) IEC 60559-compatible complex arithmetic (p: 532-545)
- C99 standard (ISO/IEC 9899:1999):
- 6.10.8/2
__STDC_IEC_559_COMPLEX__
(p: 161)
- 6.10.8/2
- 7.3 Complex arithmetic
<complex.h>
(p: 170-180)
- 7.3 Complex arithmetic
- 7.22 Type-generic math
<tgmath.h>
(p: 335-337)
- 7.22 Type-generic math
- 7.26.1 Complex arithmetic
<complex.h>
(p: 401)
- 7.26.1 Complex arithmetic
- Annex G (informative) IEC 60559-compatible complex arithmetic (p: 467-480)
[edit] See also
C++ documentation for Complex number arithmetic
|