C言語の複素数型の四則計算(足し算,引き算,掛け算,割り算)と標準ライブラリ関数の使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
C言語のC99規格で複素数型が採用されたことはご存知ですか?
しかし,あまり広く使われていないので,使い方がわからないですよね.
そんなあなたにC言語の複素数型の四則計算(足し算,引き算,掛け算,割り算)と標準ライブラリ関数の使い方を紹介します.
本記事は,複素数を理解していることを前提とします.
目次
C言語の複素数型
C言語で複素数型はcomplex.hで定義されています.
complex.hで主に利用するマクロは以下になります.
- complex:キーワード_Complexのエイリアスで,複素数のデータ型の定義で利用(例:double complex d;)
- I:虚数単位(例:3.4I,3.4 * I,y * I(yは実数))
ここで,complexキーワードは,GCC/Clangで利用できますが,Visual Studioでは利用できないことに注意して下さい.
Visual Studioでは,complexキーワードがサポートされていないため,構造体型を使って複素数を表しています.
また,C99規格の_ImaginaryキーワードはGCC/Clangではサポートしていません.
C言語の複素数型は文字型(char)や整数型(int)にも利用できますが,基本的には浮動小数点型(float/double/long double)を対象としていることに注意して下さい.
複素数型を利用する場合,以下のようにデータ型と変数名の間にcomplexと書いて定義します.
1 2 3 4 5 |
char complex c; int complex i; float complex f; double complex d; long double complex ld; |
また,double型の複素数の実数部(実部)と虚数部(虚部)を取得するためには,creal/cimag関数を利用します.
※文字型(char)や整数型(int)には同じ型の関数はありませんので,creal/cimag関数を利用します.
printf関数でdouble型の変数dの実部と虚部を,それぞれcreal関数とcimag関数で表示するコードは以下になります.
1 |
printf("creal(d) = %lf, cimag(d) = %lfI\n", creal(d), cimag(d)); |
複素数型の四則計算(足し算,引き算,掛け算,割り算)
複素数型の四則計算(足し算,引き算,掛け算,割り算)をするコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <complex.h> int main(void) { double complex x = 1.2 + 3.4I; double complex y; double real, imag; printf("creal(x) = %lf, cimag(x) = %lfI\n", creal(x), cimag(x)); printf("Please input real and imag numbers: "); scanf("%lf%lf", &real, &imag); y = real + imag * I; printf("creal(y) = %lf, cimag(y) = %lfI\n", creal(y), cimag(y)); printf("x + y = %lf%+lfI\n", creal(x + y), cimag(x + y)); printf("x - y = %lf%+lfI\n", creal(x - y), cimag(x - y)); printf("x * y = %lf%+lfI\n", creal(x * y), cimag(x * y)); printf("x / y = %lf%+lfI\n", creal(x / y), cimag(x / y)); return 0; } |
実行結果は以下になります.
xの実部は1.2,虚部は3.4が代入されています.
4行目でyの実部と虚部を,それぞれ5.6と7.8と入力します.
6~9行目で複素数xとyで四則演算した結果を表示しています.
1 2 3 4 5 6 7 8 9 |
$ gcc complex.c $ a.out creal(x) = 1.200000, cimag(x) = 3.400000I Please input real and imag numbers: 5.6 7.8 creal(y) = 5.600000, cimag(y) = 7.800000I x + y = 6.800000+11.200000I x - y = -4.400000-4.400000I x * y = -19.800000+28.400000I x / y = 0.360521+0.104989I |
複素数型の標準ライブラリ関数
複素数型の標準ライブラリ関数を紹介します.
複素数型の標準ライブラリ関数は,大きく分けて以下の4種類になりますので,それぞれ解説していきます.
- 複素数操作関数
- 複素数三角関数
- 複素数双曲線関数
- 複素数指数関数,複素数対数関数,複素数べき乗関数,複素数平方根関数
複素数操作関数
複素数操作関数を紹介します.
CMPLX/CMPLXF/CMPLXLマクロ
1 2 3 |
double complex CMPLX(double x, double y); float complex CMPLXF(float x, float y); long double complex CMPLXL(long double x, long double y); |
CMPLX/CMPLXF/CMPLXLマクロは,指定された複素数型の式に展開され,実部はxの(変換後の)値,虚部はyの(変換後の)値を複素数として変換されるマクロです.
creal/crealf/creall関数
1 2 3 |
double creal(double complex z); float crealf(float complex z); long double creall(long double complex z); |
creal/crealf/creall関数は,複素数zの実部を返す関数です.
cimag/cimagf/cimagl関数
1 2 3 |
double cimag(double complex z); float cimagf(float complex z); long double cimagl(long double complex z); |
cimag/cimagf/cimagl関数は,複素数zの実部を返す関数です.
cabs/cabsf/cabsl関数
1 2 3 |
double cabs(double complex z); float cabsf(float complex z); long double cabsl(long double complex z); |
cabs/cabsf/cabsl関数は,複素数zの絶対値を返す関数です.
実数の絶対値を標準ライブラリ関数と自作関数・マクロで計算する方法を知りたいあなたはこちらからどうぞ.
carg/cargf/cargl関数
1 2 3 |
double carg(double complex z); float cargf(float complex z); long double cargl(long double complex z); |
carg/cargf/cargl関数は,複素数zの偏角を返す関数です.
複素数の偏角とは,複素数平面上で複素数が表す点の動径が表す一般角のことです.
conj/conjf/conjl関数
1 2 3 |
double complex conj(double complex z); float complex conjf(float complex z); long double complex conjl(long double complex z); |
conj/conjf/conjl関数は,複素数zの複素共役を返す関数です.
複素共役とは,複素数の虚部を反数にした複素数をとる操作(写像)のことです.
cproj/cprojf/cprojl関数
1 2 3 |
double complex cproj(double complex z); float complex cprojf(float complex z); long double complex cprojl(long double complex z); |
cproj/cprojf/cprojl関数は,複素数zのリーマン球面への射影を返す関数です.
すべての複素数無限大(一方の部分が無限大,他方の部分がNaNの場合でも)は実軸上で正の無限大に射影され,これ以外はzはzに射影されます.
ここで,zの実部または虚部が無限大の場合,cproj(z) は次の値と等価です.
※copysign関数は数の符号をコピーする関数です.
1 |
INFINITY + copysign(0.0, cimag(z)) * I; |
複素数操作関数の使い方
複素数操作関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <complex.h> #include <math.h> int main(void) { double complex d = CMPLX(1.2, 3.4); double complex r; float complex f = CMPLXF(1.2, 3.4); float complex rf; long double complex ld = CMPLXL(1.2, 3.4); long double complex rl; printf("creal(%lf%+lfI) = %lf\n", creal(d), cimag(d), creal(d)); printf("crealf(%f%+fI) = %f\n", crealf(f), cimagf(f), crealf(f)); printf("creall(%Lf%+LfI) = %Lf\n", creall(ld), cimagl(ld), creall(ld)); printf("cimag(%lf%+lfI) = %lf\n", creal(d), cimag(d), cimag(d)); printf("cimagf(%f%+fI) = %f\n", crealf(f), cimagf(f), cimagf(f)); printf("cimagl(%Lf%+LfI) = %Lf\n", creall(ld), cimagl(ld), cimagl(ld)); printf("cabs(%lf%+lfI) = %lf\n", creal(d), cimag(d), cabs(d)); printf("cabsf(%f%+fI) = %f\n", crealf(f), cimagf(f), cabsf(f)); printf("cabsl(%Lf%+LfI) = %Lf\n", creall(ld), cimagl(ld), cabsl(ld)); printf("carg(%lf%+lfI) = %lf\n", creal(d), cimag(d), carg(d)); printf("cargf(%f%+fI) = %f\n", crealf(f), cimagf(f), cargf(f)); printf("cargl(%Lf%+LfI) = %Lf\n", creall(ld), cimagl(ld), cargl(ld)); r = conj(d); rf = conjf(f); rl = conjl(ld); printf("conj(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("conjf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("conjl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = cproj(d); rf = cprojf(f); rl = cprojl(ld); printf("cproj(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("cprojf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("cprojl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ gcc complex_basic_functions.c -lm $ a.out creal(1.200000+3.400000I) = 1.200000 crealf(1.200000+3.400000I) = 1.200000 creall(1.200000+3.400000I) = 1.200000 cimag(1.200000+3.400000I) = 3.400000 cimagf(1.200000+3.400000I) = 3.400000 cimagl(1.200000+3.400000I) = 3.400000 cabs(1.200000+3.400000I) = 3.605551 cabsf(1.200000+3.400000I) = 3.605551 cabsl(1.200000+3.400000I) = 3.605551 carg(1.200000+3.400000I) = 1.231504 cargf(1.200000+3.400000I) = 1.231504 cargl(1.200000+3.400000I) = 1.231504 conj(1.200000+3.400000I) = 1.200000-3.400000I conjf(1.200000+3.400000I) = 1.200000-3.400000I conjl(1.200000+3.400000I) = 1.200000-3.400000I cproj(1.200000+3.400000I) = 1.200000+3.400000I cprojf(1.200000+3.400000I) = 1.200000+3.400000I cprojl(1.200000+3.400000I) = 1.200000+3.400000I |
複素数三角関数
複素数三角関数を紹介します.
実数の三角関数を知りたいあなたはこちらからどうぞ.
csin/csinf/csinl関数
1 2 3 |
double complex csin(double complex z); float complex csinf(float complex z); long double complex csinl(long double complex z); |
csin/csinf/csinl関数は,複素数zの正弦を返す関数です.
ccos/ccosf/ccosl関数
1 2 3 |
double complex ccos(double complex z); float complex ccosf(float complex z); long double complex ccosl(long double complex z); |
ccos/ccosf/ccosl関数は,複素数zの余弦を返す関数です.
ctan/ctanf/ctanl関数
1 2 3 |
double complex ctan(double complex z); float complex ctanf(float complex z); long double complex ctanl(long double complex z); |
ctan/ctanf/ctanl関数は,複素数zの正接を返す関数です.
casin/casinf/casinl関数
1 2 3 |
double complex casin(double complex z); float complex casinf(float complex z); long double complex casinl(long double complex z); |
casin/casinf/casinl関数は,複素数zの逆正弦を返す関数です.
cacos/cacosf/cacosl関数
1 2 3 |
double complex cacos(double complex z); float complex cacosf(float complex z); long double complex cacosl(long double complex z); |
cacos/cacosf/cacosl関数は,複素数zの逆余弦を返す関数です.
catan/catanf/catanl関数
1 2 3 |
double complex catan(double complex z); float complex catanf(float complex z); long double complex catanl(long double complex z); |
catan/catanf/catanl関数は,複素数zの逆正接を返す関数です.
複素数三角関数の使い方
複素数三角関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <complex.h> int main(void) { double complex d = CMPLX(1.2, 3.4); double complex r; float complex f = CMPLXF(1.2, 3.4); float complex rf; long double complex ld = CMPLXL(1.2, 3.4); long double complex rl; r = csin(d); rf = csinf(f); rl = csinl(ld); printf("csin(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("csinf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("csinl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = ccos(d); rf = ccosf(f); rl = ccosl(ld); printf("ccos(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("ccosf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("ccosl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = ctan(d); rf = ctanf(f); rl = ctanl(ld); printf("ctan(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("ctanf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("ctanl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = casin(d); rf = casinf(f); rl = casinl(ld); printf("casin(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("casinf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("casinl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = cacos(d); rf = cacosf(f); rl = cacosl(ld); printf("cacos(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("cacosf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("cacosl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = catan(d); rf = catanf(f); rl = catanl(ld); printf("catan(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("catanf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("catanl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ gcc complex_trigonometric_functions.c -lm $ a.out csin(1.200000+3.400000I) = 13.979409+5.422815I csinf(1.200000+3.400000I) = 13.979410+5.422815I csinl(1.200000+3.400000I) = 13.979409+5.422815I ccos(1.200000+3.400000I) = 5.434909-13.948304I ccosf(1.200000+3.400000I) = 5.434908-13.948305I ccosl(1.200000+3.400000I) = 5.434909-13.948304I ctan(1.200000+3.400000I) = 0.001507+1.001643I ctanf(1.200000+3.400000I) = 0.001507+1.001643I ctanl(1.200000+3.400000I) = 0.001507+1.001643I casin(1.200000+3.400000I) = 0.327743+1.990465I casinf(1.200000+3.400000I) = 0.327743+1.990465I casinl(1.200000+3.400000I) = 0.327743+1.990465I cacos(1.200000+3.400000I) = 1.243053-1.990465I cacosf(1.200000+3.400000I) = 1.243053-1.990465I cacosl(1.200000+3.400000I) = 1.243053-1.990465I catan(1.200000+3.400000I) = 1.472099+0.265218I catanf(1.200000+3.400000I) = 1.472099+0.265218I catanl(1.200000+3.400000I) = 1.472099+0.265218I |
複素数双曲線関数
複素数双曲線関数を紹介します.
実数の双曲線関数を知りたいあなたはこちらからどうぞ.
csinh/csinhf/csinhl関数
1 2 3 |
double complex csinh(double complex z); float complex csinhf(float complex z); long double complex csinhl(long double complex z); |
csinh/csinhf/csinhl関数は,複素数zの双曲線正弦を返す関数です.
ccosh/ccoshf/ccoshl関数
1 2 3 |
double complex ccosh(double complex z); float complex ccoshf(float complex z); long double complex ccoshl(long double complex z); |
ccosh/ccoshf/ccoshl関数は,複素数zの双曲線余弦を返す関数です.
ctanh/ctanhf/ctanhl関数
1 2 3 |
double complex ctanh(double complex z); float complex ctanhf(float complex z); long double complex ctanhl(long double complex z); |
ctanh/ctanhf/ctanhl関数は,複素数zの双曲線正接を返す関数です.
casinh/casinhf/casinhl関数
1 2 3 |
double complex casinh(double complex z); float complex casinhf(float complex z); long double complex casinhl(long double complex z); |
casinh/casinhf/casinhl関数は,複素数zの逆双曲線正弦を返す関数です.
cacosh/cacoshf/cacoshl関数
1 2 3 |
double complex cacosh(double complex z); float complex cacoshf(float complex z); long double complex cacoshl(long double complex z); |
cacosh/cacoshf/cacoshl関数は,複素数zの逆双曲線余弦を返す関数です.
catanh/catanhf/catanhl関数
1 2 3 |
double complex catanh(double complex z); float complex catanhf(float complex z); long double complex catanhl(long double complex z); |
catanh/catanhf/catanhl関数は,複素数zの逆双曲線正接を返す関数です.
複素数双曲線関数の使い方
複素数双曲線関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <complex.h> int main(void) { double complex d = CMPLX(1.2, 3.4); double complex r; float complex f = CMPLXF(1.2, 3.4); float complex rf; long double complex ld = CMPLXL(1.2, 3.4); long double complex rl; r = csinh(d); rf = csinhf(f); rl = csinhl(ld); printf("csinh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("csinhf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("csinhl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = ccosh(d); rf = ccoshf(f); rl = ccoshl(ld); printf("ccosh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("ccoshf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("ccoshl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = ctanh(d); rf = ctanhf(f); rl = ctanhl(ld); printf("ctanh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("ctanhf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("ctanhl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = casinh(d); rf = casinhf(f); rl = casinhl(ld); printf("casinh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("casinhf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("casinhl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = cacosh(d); rf = cacoshf(f); rl = cacoshl(ld); printf("cacosh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("cacoshf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("cacoshl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = catanh(d); rf = catanhf(f); rl = catanhl(ld); printf("catanh(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("catanhf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("catanhl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ gcc complex_hyperbolic_functions.c -lm $ a.out csinh(1.200000+3.400000I) = -1.459345-0.462697I csinhf(1.200000+3.400000I) = -1.459345-0.462697I csinhl(1.200000+3.400000I) = -1.459345-0.462697I ccosh(1.200000+3.400000I) = -1.750539-0.385729I ccoshf(1.200000+3.400000I) = -1.750539-0.385730I ccoshl(1.200000+3.400000I) = -1.750539-0.385729I ctanh(1.200000+3.400000I) = 0.850597+0.076889I ctanhf(1.200000+3.400000I) = 0.850597+0.076889I ctanhl(1.200000+3.400000I) = 0.850597+0.076889I casinh(1.200000+3.400000I) = 1.960546+1.218869I casinhf(1.200000+3.400000I) = 1.960546+1.218869I casinhl(1.200000+3.400000I) = 1.960546+1.218869I cacosh(1.200000+3.400000I) = 1.990465+1.243053I cacoshf(1.200000+3.400000I) = 1.990465+1.243053I cacoshl(1.200000+3.400000I) = 1.990465+1.243053I catanh(1.200000+3.400000I) = 0.086569+1.313022I catanhf(1.200000+3.400000I) = 0.086569+1.313022I catanhl(1.200000+3.400000I) = 0.086569+1.313022I |
複素数指数関数,複素数対数関数,複素数べき乗関数,複素数平方根関数
複素数指数関数,複素数対数関数,複素数べき乗関数,複素数平方根関数を紹介します.
実数の指数関数,対数関数,べき乗関数,平方根関数を知りたいあなたはこちらからどうぞ.
cexp/cexpf/cexpl関数
1 2 3 |
double complex cexp(double complex z); float complex cexpf(float complex z); long double complex cexpl(long double complex z); |
cexp/cexpf/cexpl関数は,eの複素数z乗を返す関数です.
以下の関係が成立します.
1 |
cexp(z * I) == ccos(z) + csin(z) * I; |
clog/clogf/clogl関数
1 2 3 |
double complex clog(double complex z); float complex clogf(float complex z); long double complex clogl(long double complex z); |
clog/clogf/clogl関数は,複素数zの自然対数を返す関数です.
以下の関係が成立します.
1 |
clog(z) == log(cabs(z)) + carg(z) * I; |
clog10/clog10f/clog10l関数
1 2 3 |
double complex clog10(double complex z); float complex clog10f(float complex z); long double complex clog10l(long double complex z); |
clog10/clog10f/clog10l関数は,底が10の複素数zの対数を返します.
以下の関係が成立します.
1 2 |
clog10(z) == clog(z) / log(10); clog10(z) == log10(cabs(c)) + (carg(c) * I) / log(10); |
cpow/cpowf/cpowl関数
1 2 3 4 |
double complex cpow(double complex x, complex double z); float complex cpowf(float complex x, complex float z); long double complex cpowl(long double complex x, complex long double z); |
cpow/cpowf/cpowl関数は,複素数xの複素数z乗を返す関数です.
csqrt/csqrtf/csqrtl関数
1 2 3 |
double complex csqrt(double complex z); float complex csqrtf(float complex z); long double complex csqrtl(long double complex z); |
csqrt/csqrtf/csqrtl関数は,複素数zの平方根を返す関数です.
複素数指数関数,複素数対数関数,複素数べき乗関数,複素数平方根関数の使い方
複素数指数関数,複素数対数関数,複素数べき乗関数,複素数平方根関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #define _GNU_SOURCE #include <stdio.h> #include <complex.h> #include <math.h> int main(void) { double complex d = CMPLX(1.2, 3.4); double complex r; float complex f = CMPLXF(1.2, 3.4); float complex rf; long double complex ld = CMPLXL(1.2, 3.4); long double complex rl; r = cexp(d); rf = cexpf(f); rl = cexpl(ld); printf("cexp(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("cexpf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("cexpl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = clog(d); rf = clogf(f); rl = clogl(ld); printf("clog(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("clogf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("clogl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = clog10(d); rf = clog10f(f); rl = clog10l(ld); printf("clog10(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("clog10f(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("clog10l(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = cpow(d, d); rf = cpowf(f, f); rl = cpowl(ld, ld); printf("cpow(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("cpowf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("cpowl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); r = csqrt(d); rf = csqrtf(f); rl = csqrtl(ld); printf("csqrt(%lf%+lfI) = %lf%+lfI\n", creal(d), cimag(d), creal(r), cimag(r)); printf("csqrtf(%f%+fI) = %f%+fI\n", crealf(f), cimagf(f), crealf(rf), cimagf(rf)); printf("csqrtl(%Lf%+LfI) = %Lf%+LfI\n", creall(ld), cimagl(ld), creall(rl), cimagl(rl)); return 0; } |
実行結果は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ gcc complex_cexp_clog_cpow_csqrt_functions.c -lm $ a.out cexp(1.200000+3.400000I) = -3.209883-0.848426I cexpf(1.200000+3.400000I) = -3.209883-0.848427I cexpl(1.200000+3.400000I) = -3.209883-0.848426I clog(1.200000+3.400000I) = 1.282475+1.231504I clogf(1.200000+3.400000I) = 1.282475+1.231504I clogl(1.200000+3.400000I) = 1.282475+1.231504I clog10(1.200000+3.400000I) = 0.556972+0.534835I clog10f(1.200000+3.400000I) = 0.556972+0.534835I clog10l(1.200000+3.400000I) = 0.556972+0.534835I cpow(1.200000+3.400000I) = 0.063890-0.030467I cpowf(1.200000+3.400000I) = 0.063890-0.030467I cpowl(1.200000+3.400000I) = 0.063890-0.030467I csqrt(1.200000+3.400000I) = 1.550089+1.096711I csqrtf(1.200000+3.400000I) = 1.550089+1.096711I csqrtl(1.200000+3.400000I) = 1.550089+1.096711I |
まとめ
C言語の複素数型の四則計算(足し算,引き算,掛け算,割り算)と標準ライブラリ関数の使い方を紹介しました.
C言語で複素数を使いこなしましょう!
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!