C言語で三角関数のsin/cos/tan関数の使い方と自作関数を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴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社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
三角関数のsin/cos/tan関数
三角関数の正弦/余弦/正接を計算するsin/cos/tan関数を紹介します.
sin/sinf/sinl関数の使い方
1 2 3 |
double sin(double x); float sinf(float x); long double sinl(long double x); |
sin/sinf/sinl関数は,double/float/long double型の引数xの正弦 (サイン) を返す関数です(単位はラジアン).
sin/sinf/sinl関数を利用するコードは以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" sin(%lf) = %lf\n", d, sin(d)); printf("sinf(%f) = %f\n", f, sinf(f)); printf("sinl(%Lf) = %Lf\n", ld, sinl(ld)); } return 0; } |
実行結果は以下になります.
コンパイルする時は-lmオプションを付けることに注意して下さい.
計算誤差の影響のため,引数が\(\pi\)の時の15~16行目のsin/sinf関数の返り値は-0.000000ですが,17行目のsinl関数の返り値は0.000000と異なる結果になっていることがわかります.
引数が\(2\pi\)の時の27~28行目のsin/sinf関数の返り値は0.000000ですが,29行目のsinl関数の返り値は-0.000000になることも同様です.
三角関数(ラジアン)で実行結果を比較してみましょう.
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 |
$ gcc sin.c -lm $ a.out sin(0.000000) = 0.000000 sinf(0.000000) = 0.000000 sinl(0.000000) = 0.000000 sin(0.785398) = 0.707107 sinf(0.785398) = 0.707107 sinl(0.785398) = 0.707107 sin(1.570796) = 1.000000 sinf(1.570796) = 1.000000 sinl(1.570796) = 1.000000 sin(2.356194) = 0.707107 sinf(2.356194) = 0.707107 sinl(2.356194) = 0.707107 sin(3.141593) = -0.000000 sinf(3.141593) = -0.000000 sinl(3.141593) = 0.000000 sin(3.926991) = -0.707107 sinf(3.926991) = -0.707107 sinl(3.926991) = -0.707107 sin(4.712389) = -1.000000 sinf(4.712389) = -1.000000 sinl(4.712389) = -1.000000 sin(5.497787) = -0.707107 sinf(5.497787) = -0.707107 sinl(5.497787) = -0.707107 sin(6.283185) = 0.000000 sinf(6.283185) = 0.000000 sinl(6.283185) = -0.000000 |
cos/cosf/cosl関数の使い方
1 2 3 |
double cos(double x); float cosf(float x); long double cosl(long double x); |
cos/cosf/cosl関数は,double/float/long double型の引数xの余弦(コサイン) を返す関数です(単位はラジアン).
cos/cosf/cosl関数を利用するコードは以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" cos(%lf) = %lf\n", d, cos(d)); printf("cosf(%f) = %f\n", f, cosf(f)); printf("cosl(%Lf) = %Lf\n", ld, cosl(ld)); } return 0; } |
実行結果は以下になります.
計算誤差の影響のため,引数が\(\pi/2\)の時の9~10行目のcos/cosf関数の返り値は-0.000000ですが,11行目のcosl関数の返り値は0.000000と異なる結果になっていることがわかります.
引数が\(3\pi/2\)の時の21~22行目のcos/cosf関数の返り値は0.000000ですが,23行目のcosl関数の返り値は-0.000000になることも同様です.
三角関数(ラジアン)で実行結果を比較してみましょう.
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 |
$ gcc cos.c -lm $ a.out cos(0.000000) = 1.000000 cosf(0.000000) = 1.000000 cosl(0.000000) = 1.000000 cos(0.785398) = 0.707107 cosf(0.785398) = 0.707107 cosl(0.785398) = 0.707107 cos(1.570796) = -0.000000 cosf(1.570796) = -0.000000 cosl(1.570796) = 0.000000 cos(2.356194) = -0.707107 cosf(2.356194) = -0.707107 cosl(2.356194) = -0.707107 cos(3.141593) = -1.000000 cosf(3.141593) = -1.000000 cosl(3.141593) = -1.000000 cos(3.926991) = -0.707107 cosf(3.926991) = -0.707107 cosl(3.926991) = -0.707107 cos(4.712389) = 0.000000 cosf(4.712389) = 0.000000 cosl(4.712389) = -0.000000 cos(5.497787) = 0.707107 cosf(5.497787) = 0.707107 cosl(5.497787) = 0.707107 cos(6.283185) = 1.000000 cosf(6.283185) = 1.000000 cosl(6.283185) = 1.000000 |
tan/tanf/tanl関数の使い方
1 2 3 |
double tan(double x); float tanf(float x); long double tanl(long double x); |
tan/tanf/tanl関数は,double/float/long double型の引数xの正接(タンジェント) を返す関数です(単位はラジアン).
tan/tanf/tanl関数を利用するコードは以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" tan(%lf) = %lf\n", d, tan(d)); printf("tanf(%f) = %f\n", f, tanf(f)); printf("tanl(%Lf) = %Lf\n", ld, tanl(ld)); } return 0; } |
実行結果は以下になります.
計算誤差の影響のため,引数が\(\pi/2\)の時の9~10行目のtan/tanf関数の返り値は-22877332.428856/-22877334.000000ですが,11行目のtanl関数の返り値は16331239353195369.755859と異なる結果になっていることがわかります.
引数が\(3\pi/2\)の時の21~22行目のtan/tanf関数の返り値は-83858283.006684/-83858280.000000ですが,23行目のtanl関数の返り値は5443746451065123.251953になることも同様です.
また,sin/cos関数と同様に,返り値が0になる場合は符号の正負が異なる場合があります(15~17行目,27~29行目).
三角関数(ラジアン)で実行結果を比較してみましょう.
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 |
gcc tan.c -lm $ a.out tan(0.000000) = 0.000000 tanf(0.000000) = 0.000000 tanl(0.000000) = 0.000000 tan(0.785398) = 1.000000 tanf(0.785398) = 1.000000 tanl(0.785398) = 1.000000 tan(1.570796) = -22877332.428856 tanf(1.570796) = -22877334.000000 tanl(1.570796) = 16331239353195369.755859 tan(2.356194) = -1.000000 tanf(2.356194) = -1.000000 tanl(2.356194) = -1.000000 tan(3.141593) = 0.000000 tanf(3.141593) = 0.000000 tanl(3.141593) = -0.000000 tan(3.926991) = 1.000000 tanf(3.926991) = 1.000000 tanl(3.926991) = 1.000000 tan(4.712389) = -83858283.006684 tanf(4.712389) = -83858280.000000 tanl(4.712389) = 5443746451065123.251953 tan(5.497787) = -1.000000 tanf(5.497787) = -1.000000 tanl(5.497787) = -1.000000 tan(6.283185) = 0.000000 tanf(6.283185) = 0.000000 tanl(6.283185) = -0.000000 |
sin/cos/tan関数の自作関数
sin/cos/tan関数の自作関数を紹介します.
コードが冗長にならないようにするため,自作関数には以下の関数を利用します.
これらの関数の自作関数を知りたいあなたはこちらからどうぞ.
sin/sinf/sinl関数の自作関数
sin/sinf/sinl関数の自作関数「mysin/mysinf/mysinl関数」の実装には,sin関数のテイラー展開(マクローリン展開)を利用しています(下式).
$$\sin x = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n+1} = x - \frac{x^3}{3!} + \frac{x^5}{5!} - ...\ (\rm for\ all\ x)$$
mysin/mysinf/mysinl関数のコードは以下になります.
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdbool.h> #include <math.h> #include <float.h> #include <errno.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) double mysin(double x) { double t = x; double y = x; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of sin(x) */ t = - (t * x * x) / ((2 * n + 1) * (2 * n)); if (fabs(t) <= DBL_EPSILON) { break; } y += t; n++; } return y; } float mysinf(float x) { float t = x; float y = x; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of sin(x) */ t = - (t * x * x) / ((2 * n + 1) * (2 * n)); if (fabsf(t) <= FLT_EPSILON) { break; } y += t; n++; } return y; } long double mysinl(long double x) { long double t = x; long double y = x; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of sin(x) */ t = - (t * x * x) / ((2 * n + 1) * (2 * n)); if (fabsl(t) <= LDBL_EPSILON) { break; } y += t; n++; } return y; } int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" mysin(%lf) = %lf\n", d, mysin(d)); printf("mysinf(%f) = %f\n", f, mysinf(f)); printf("mysinl(%Lf) = %Lf\n", ld, mysinl(ld)); } return 0; } |
実行結果は以下になります.
計算誤差の影響のため,返り値が0の場合は符号の正負が異なる場合がありますが,元のsin/sinf/sinl関数とほぼ同様の結果が得られていることがわかります.
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 |
$ gcc mysin.c $ a.out mysin(0.000000) = 0.000000 mysinf(0.000000) = 0.000000 mysinl(0.000000) = 0.000000 mysin(0.785398) = 0.707107 mysinf(0.785398) = 0.707107 mysinl(0.785398) = 0.707107 mysin(1.570796) = 1.000000 mysinf(1.570796) = 1.000000 mysinl(1.570796) = 1.000000 mysin(2.356194) = 0.707107 mysinf(2.356194) = 0.707107 mysinl(2.356194) = 0.707107 mysin(3.141593) = -0.000000 mysinf(3.141593) = 0.000000 mysinl(3.141593) = 0.000000 mysin(3.926991) = -0.707107 mysinf(3.926991) = -0.707107 mysinl(3.926991) = -0.707107 mysin(4.712389) = -1.000000 mysinf(4.712389) = -1.000000 mysinl(4.712389) = -1.000000 mysin(5.497787) = -0.707107 mysinf(5.497787) = -0.707107 mysinl(5.497787) = -0.707107 mysin(6.283185) = 0.000000 mysinf(6.283185) = -0.000001 mysinl(6.283185) = -0.000000 |
cos/cosf/cosl関数の自作関数
cos/cosf/cosl関数の自作関数「mycos/mycosf/mycosl関数」の実装には,cos関数のテイラー展開(マクローリン展開)を利用しています(下式).
$$\cos x = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n)!} x^{2n} = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - ...\ (\rm for\ all\ x)$$
mycos/mycosf/mycosl関数のコードは以下になります.
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdbool.h> #include <math.h> #include <float.h> #include <errno.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) double mycos(double x) { double t = 1.0; double y = 1.0; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of cos(x) */ t = - (t * x * x) / ((2 * n) * (2 * n - 1)); if (fabs(t) <= DBL_EPSILON) { break; } y += t; n++; } return y; } float mycosf(float x) { float t = 1.0; float y = 1.0; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of cos(x) */ t = - (t * x * x) / ((2 * n) * (2 * n - 1)); if (fabsf(t) <= FLT_EPSILON) { break; } y += t; n++; } return y; } long double mycosl(long double x) { long double t = 1.0; long double y = 1.0; int n = 1; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } while (true) { /* maclaurin expansion of cos(x) */ t = - (t * x * x) / ((2 * n) * (2 * n - 1)); if (fabsl(t) <= LDBL_EPSILON) { break; } y += t; n++; } return y; } int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" mycos(%lf) = %lf\n", d, mycos(d)); printf("mycosf(%f) = %f\n", f, mycosf(f)); printf("mycosl(%Lf) = %Lf\n", ld, mycosl(ld)); } return 0; } |
実行結果は以下になります.
計算誤差の影響のため,返り値が0の場合は符号の正負が異なる場合がありますが,元のcos/cosf/cosl関数とほぼ同様の結果が得られていることがわかります.
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 |
$ gcc mycos.c $ a.out mycos(0.000000) = 1.000000 mycosf(0.000000) = 1.000000 mycosl(0.000000) = 1.000000 mycos(0.785398) = 0.707107 mycosf(0.785398) = 0.707107 mycosl(0.785398) = 0.707107 mycos(1.570796) = -0.000000 mycosf(1.570796) = -0.000000 mycosl(1.570796) = 0.000000 mycos(2.356194) = -0.707107 mycosf(2.356194) = -0.707107 mycosl(2.356194) = -0.707107 mycos(3.141593) = -1.000000 mycosf(3.141593) = -1.000000 mycosl(3.141593) = -1.000000 mycos(3.926991) = -0.707107 mycosf(3.926991) = -0.707106 mycosl(3.926991) = -0.707107 mycos(4.712389) = 0.000000 mycosf(4.712389) = 0.000002 mycosl(4.712389) = -0.000000 mycos(5.497787) = 0.707107 mycosf(5.497787) = 0.707108 mycosl(5.497787) = 0.707107 mycos(6.283185) = 1.000000 mycosf(6.283185) = 0.999997 mycosl(6.283185) = 1.000000 |
tan/tanf/tanl関数の自作関数
tan/tanf/tanl関数の自作関数「mytan/mytanf/mytanl関数」の実装には,tan関数のテイラー展開(マクローリン展開)を利用しています(下式).
$$\tan x = \sum_{n=1}^{\infty} \frac{B_{2n} (-4)^n (1 - 4^n)}{(2n)!} x^{2n-1} \ (\rm for\ |x| < \frac{\pi}{2})$$
ここで,Bはベルヌーイ数です.
mytan/mytanf/mytanl関数のコードは以下になります.
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdbool.h> #include <math.h> #include <float.h> #include <errno.h> #define PI 3.1415926535897932384626433832795 #define MAX (2 * PI) #define N 8 #define STEP (MAX / N) #define MAX_BERNOULLI_ODD_NUMBER 19 #define DIFF_RELATED_TO_PI 4.4544551033807686783083602485579e-6 bool is_odd(int n) { return n & 1; } double mytan(double x) { int k = (int)(x / (PI / 2) + (x >= 0.0 ? 0.5 : -0.5)); double t; int i; double x2; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } /* maclaurin expansion of tan(x) */ x = (x - (3217.0 / 2048) * k) + DIFF_RELATED_TO_PI * k; x2 = x * x; t = 0; for (i = MAX_BERNOULLI_ODD_NUMBER; i >= 3; i -= 2) { t = x2 / (i - t); } t = x / (1 - t); if (!is_odd(k)) { return t; } if (fabs(t) > DBL_EPSILON) { return -1 / t; } /* overflow */ return HUGE_VAL; } float mytanf(float x) { int k = (int)(x / (PI / 2) + (x >= 0.0 ? 0.5 : -0.5)); float t; int i; float x2; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } /* maclaurin expansion of tan(x) */ x = (x - (3217.0 / 2048) * k) + DIFF_RELATED_TO_PI * k; x2 = x * x; t = 0; for (i = MAX_BERNOULLI_ODD_NUMBER; i >= 3; i -= 2) { t = x2 / (i - t); } t = x / (1 - t); if (!is_odd(k)) { return t; } if (fabsf(t) > FLT_EPSILON) { return -1 / t; } /* overflow */ return HUGE_VALF; } long double mytanl(long double x) { int k = (int)(x / (PI / 2) + (x >= 0.0 ? 0.5 : -0.5)); long double t; int i; long double x2; if (!isfinite(x)) { if (isinf(x)) { errno = EDOM; } return NAN; } /* maclaurin expansion of tan(x) */ x = (x - (3217.0 / 2048) * k) + DIFF_RELATED_TO_PI * k; x2 = x * x; t = 0; for (i = MAX_BERNOULLI_ODD_NUMBER; i >= 3; i -= 2) { t = x2 / (i - t); } t = x / (1 - t); if (!is_odd(k)) { return t; } if (fabsl(t) > LDBL_EPSILON) { return -1 / t; } /* overflow */ return HUGE_VALL; } int main(void) { long double ld; double d; float f; for (ld = 0.0; ld <= MAX; ld += STEP) { d = f = ld; printf(" mytan(%lf) = %lf\n", d, mytan(d)); printf("mytanf(%f) = %f\n", f, mytanf(f)); printf("mytanl(%Lf) = %Lf\n", ld, mytanl(ld)); } return 0; } |
実行結果は以下になります.
計算誤差はありますが,tan/tanf/tanl関数とほぼ同様の結果になっていることがわかります.
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 |
$ gcc mytan.c $ a.out mytan(0.000000) = 0.000000 mytanf(0.000000) = 0.000000 mytanl(0.000000) = 0.000000 mytan(0.785398) = 1.000000 mytanf(0.785398) = 1.000000 mytanl(0.785398) = 1.000000 mytan(1.570796) = -22877332.428856 mytanf(1.570796) = inf mytanl(1.570796) = 16331326887777165.630859 mytan(2.356194) = -1.000000 mytanf(2.356194) = -1.000000 mytanl(2.356194) = -1.000000 mytan(3.141593) = 0.000000 mytanf(3.141593) = 0.000000 mytanl(3.141593) = -0.000000 mytan(3.926991) = 1.000000 mytanf(3.926991) = 1.000000 mytanl(3.926991) = 1.000000 mytan(4.712389) = -83858283.006677 mytanf(4.712389) = inf mytanl(4.712389) = 5443775629259055.209961 mytan(5.497787) = -1.000000 mytanf(5.497787) = -1.000000 mytanl(5.497787) = -1.000000 mytan(6.283185) = 0.000000 mytanf(6.283185) = 0.000000 mytanl(6.283185) = -0.000000 |
まとめ
C言語で三角関数のsin/cos/tan関数の使い方と自作関数を紹介しました.
これらの基本的な三角関数はよく使いますので,きちんと習得しておきましょう.
逆三角関数asin/acos/atan/atan2関数の使い方を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!