C言語で双曲線関数のsinh/cosh/tanh関数の使い方と自作関数を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴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社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
双曲線関数のsinh/cosh/tanh関数
双曲線関数のsinh/cosh/tanh関数を紹介します.
sinh/sinhf/sinhl関数
1 2 3 |
double sinh(double x); float sinhf(float x); long double sinhl(long double x); |
sinh/sinhf/sinhl関数は,双曲線正弦 (ハイパボリックサイン) 関数の値を返します.
sinh関数は数学的には以下の定義になります.
$$\sinh x = \frac{e^x - e^{-x}}{2} $$
cosh/coshf/coshl関数
1 2 3 |
double cosh(double x); float coshf(float x); long double coshl(long double x); |
cosh/coshf/coshl関数は,双曲線余弦 (ハイパボリックコサイン) の値を返します.
cosh関数は数学的には以下の定義になります.
$$\cosh x = \frac{e^x + e^{-x}}{2} $$
tanh/tanhf/tanhl関数
1 2 3 |
double tanh(double x); float tanhf(float x); long double tanhl(long double x); |
tanh/tanhf/tanhl関数は,双曲線正接(ハイパボリックタンジェント)の値を返します.
tanh関数は数学的には以下の定義になります.
$$\tanh x = \frac{\sinh x}{\cosh x} = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$
sinh/cosh/tanh関数の使い方
sinh/cosh/tanh関数の使い方を紹介します.
sinh/sinhf/sinhl関数の使い方
sinh/sinhf/sinhl関数の使い方は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" sinh(%lf) = %lf\n", d, sinh(d)); printf("sinhf(%f) = %f\n", f, sinhf(f)); printf("sinhl(%Lf) = %Lf\n", ld, sinhl(ld)); } return 0; } |
実行結果は以下になります.
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 sinh.c -lm $ a.out sinh(-2.000000) = -3.626860 sinhf(-2.000000) = -3.626860 sinhl(-2.000000) = -3.626860 sinh(-1.500000) = -2.129279 sinhf(-1.500000) = -2.129279 sinhl(-1.500000) = -2.129279 sinh(-1.000000) = -1.175201 sinhf(-1.000000) = -1.175201 sinhl(-1.000000) = -1.175201 sinh(-0.500000) = -0.521095 sinhf(-0.500000) = -0.521095 sinhl(-0.500000) = -0.521095 sinh(0.000000) = 0.000000 sinhf(0.000000) = 0.000000 sinhl(0.000000) = 0.000000 sinh(0.500000) = 0.521095 sinhf(0.500000) = 0.521095 sinhl(0.500000) = 0.521095 sinh(1.000000) = 1.175201 sinhf(1.000000) = 1.175201 sinhl(1.000000) = 1.175201 sinh(1.500000) = 2.129279 sinhf(1.500000) = 2.129279 sinhl(1.500000) = 2.129279 sinh(2.000000) = 3.626860 sinhf(2.000000) = 3.626860 sinhl(2.000000) = 3.626860 |
cosh/coshf/coshl関数の使い方
cosh/coshf/coshl関数の使い方は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" cosh(%lf) = %lf\n", d, cosh(d)); printf("coshf(%f) = %f\n", f, coshf(f)); printf("coshl(%Lf) = %Lf\n", ld, coshl(ld)); } return 0; } |
実行結果は以下になります.
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 cosh.c -lm $ a.out cosh(-2.000000) = 3.762196 coshf(-2.000000) = 3.762196 coshl(-2.000000) = 3.762196 cosh(-1.500000) = 2.352410 coshf(-1.500000) = 2.352410 coshl(-1.500000) = 2.352410 cosh(-1.000000) = 1.543081 coshf(-1.000000) = 1.543081 coshl(-1.000000) = 1.543081 cosh(-0.500000) = 1.127626 coshf(-0.500000) = 1.127626 coshl(-0.500000) = 1.127626 cosh(0.000000) = 1.000000 coshf(0.000000) = 1.000000 coshl(0.000000) = 1.000000 cosh(0.500000) = 1.127626 coshf(0.500000) = 1.127626 coshl(0.500000) = 1.127626 cosh(1.000000) = 1.543081 coshf(1.000000) = 1.543081 coshl(1.000000) = 1.543081 cosh(1.500000) = 2.352410 coshf(1.500000) = 2.352410 coshl(1.500000) = 2.352410 cosh(2.000000) = 3.762196 coshf(2.000000) = 3.762196 coshl(2.000000) = 3.762196 |
tanh/tanhf/tanhl関数の使い方
tanh/tanhf/tanhl関数の使い方は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" tanh(%lf) = %lf\n", d, tanh(d)); printf("tanhf(%f) = %f\n", f, tanhf(f)); printf("tanhl(%Lf) = %Lf\n", ld, tanhl(ld)); } return 0; } |
実行結果は以下になります.
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 tanh.c -lm $ a.out tanh(-2.000000) = -0.964028 tanhf(-2.000000) = -0.964028 tanhl(-2.000000) = -0.964028 tanh(-1.500000) = -0.905148 tanhf(-1.500000) = -0.905148 tanhl(-1.500000) = -0.905148 tanh(-1.000000) = -0.761594 tanhf(-1.000000) = -0.761594 tanhl(-1.000000) = -0.761594 tanh(-0.500000) = -0.462117 tanhf(-0.500000) = -0.462117 tanhl(-0.500000) = -0.462117 tanh(0.000000) = 0.000000 tanhf(0.000000) = 0.000000 tanhl(0.000000) = 0.000000 tanh(0.500000) = 0.462117 tanhf(0.500000) = 0.462117 tanhl(0.500000) = 0.462117 tanh(1.000000) = 0.761594 tanhf(1.000000) = 0.761594 tanhl(1.000000) = 0.761594 tanh(1.500000) = 0.905148 tanhf(1.500000) = 0.905148 tanhl(1.500000) = 0.905148 tanh(2.000000) = 0.964028 tanhf(2.000000) = 0.964028 tanhl(2.000000) = 0.964028 |
sinh/cosh/tanh関数の自作関数
sinh/cosh/tanh関数の自作関数を紹介します.
コードが冗長にならないようにするために,自作関数では以下の関数を利用しています.
上記の関数を知りたいあなたはこちらからどうぞ.
sinh/sinhf/sinhl関数の自作関数
sinh/sinhf/sinhl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #include <float.h> #define MAX 2 #define STEP 0.5 double mysinh(double x) { double t; if (fabs(x) > DBL_EPSILON) { t = exp(x); return (t - 1 / t) / 2; } return x * (1 + x * x / 6); } float mysinhf(float x) { float t; if (fabsf(x) > FLT_EPSILON) { t = expf(x); return (t - 1 / t) / 2; } return x * (1 + x * x / 6); } long double mysinhl(long double x) { long double t; if (fabsl(x) > LDBL_EPSILON) { t = expl(x); return (t - 1 / t) / 2; } return x * (1 + x * x / 6); } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" mysinh(%lf) = %lf\n", d, mysinh(d)); printf("mysinhf(%f) = %f\n", f, mysinhf(f)); printf("mysinhl(%Lf) = %Lf\n", ld, mysinhl(ld)); } return 0; } |
実行結果は以下になります.
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 mysinh.c -lm $ a.out mysinh(-2.000000) = -3.626860 mysinhf(-2.000000) = -3.626860 mysinhl(-2.000000) = -3.626860 mysinh(-1.500000) = -2.129279 mysinhf(-1.500000) = -2.129279 mysinhl(-1.500000) = -2.129279 mysinh(-1.000000) = -1.175201 mysinhf(-1.000000) = -1.175201 mysinhl(-1.000000) = -1.175201 mysinh(-0.500000) = -0.521095 mysinhf(-0.500000) = -0.521095 mysinhl(-0.500000) = -0.521095 mysinh(0.000000) = 0.000000 mysinhf(0.000000) = 0.000000 mysinhl(0.000000) = 0.000000 mysinh(0.500000) = 0.521095 mysinhf(0.500000) = 0.521095 mysinhl(0.500000) = 0.521095 mysinh(1.000000) = 1.175201 mysinhf(1.000000) = 1.175201 mysinhl(1.000000) = 1.175201 mysinh(1.500000) = 2.129279 mysinhf(1.500000) = 2.129279 mysinhl(1.500000) = 2.129279 mysinh(2.000000) = 3.626860 mysinhf(2.000000) = 3.626860 mysinhl(2.000000) = 3.626860 |
cosh/coshf/coshl関数の自作関数
cosh/coshf/coshl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 double mycosh(double x) { double t = exp(x); return (t + 1 / t) / 2; } float mycoshf(float x) { float t = expf(x); return (t + 1 / t) / 2; } long double mycoshl(long double x) { long double t = expl(x); return (t + 1 / t) / 2; } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" mycosh(%lf) = %lf\n", d, mycosh(d)); printf("mycoshf(%f) = %f\n", f, mycoshf(f)); printf("mycoshl(%Lf) = %Lf\n", ld, mycoshl(ld)); } return 0; } |
実行結果は以下になります.
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 mycosh.c -lm $ a.out mycosh(-2.000000) = 3.762196 mycoshf(-2.000000) = 3.762196 mycoshl(-2.000000) = 3.762196 mycosh(-1.500000) = 2.352410 mycoshf(-1.500000) = 2.352410 mycoshl(-1.500000) = 2.352410 mycosh(-1.000000) = 1.543081 mycoshf(-1.000000) = 1.543081 mycoshl(-1.000000) = 1.543081 mycosh(-0.500000) = 1.127626 mycoshf(-0.500000) = 1.127626 mycoshl(-0.500000) = 1.127626 mycosh(0.000000) = 1.000000 mycoshf(0.000000) = 1.000000 mycoshl(0.000000) = 1.000000 mycosh(0.500000) = 1.127626 mycoshf(0.500000) = 1.127626 mycoshl(0.500000) = 1.127626 mycosh(1.000000) = 1.543081 mycoshf(1.000000) = 1.543081 mycoshl(1.000000) = 1.543081 mycosh(1.500000) = 2.352410 mycoshf(1.500000) = 2.352410 mycoshl(1.500000) = 2.352410 mycosh(2.000000) = 3.762196 mycoshf(2.000000) = 3.762196 mycoshl(2.000000) = 3.762196 |
tanh/tanhf/tanhl関数の自作関数
tanh/tanhf/tanhl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #include <float.h> #define MAX 2 #define STEP 0.5 double mytanh(double x) { if (x > DBL_EPSILON) { return 2 / (1 + exp(-2 * x)) - 1; } else if (x < -DBL_EPSILON) { return 1 - 2 / (exp(2 * x) + 1); } else { return x * (1 - x * x / 3); } } float mytanhf(float x) { if (x > FLT_EPSILON) { return 2 / (1 + expf(-2 * x)) - 1; } else if (x < -FLT_EPSILON) { return 1 - 2 / (expf(2 * x) + 1); } else { return x * (1 - x * x / 3); } } long double mytanhl(long double x) { if (x > LDBL_EPSILON) { return 2 / (1 + expl(-2 * x)) - 1; } else if (x < -LDBL_EPSILON) { return 1 - 2 / (expl(2 * x) + 1); } else { return x * (1 - x * x / 3); } } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" mytanh(%lf) = %lf\n", d, mytanh(d)); printf("mytanhf(%f) = %f\n", f, mytanhf(f)); printf("mytanhl(%Lf) = %Lf\n", ld, mytanhl(ld)); } return 0; } |
実行結果は以下になります.
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 mytanh.c -lm $ a.out mytanh(-2.000000) = -0.964028 mytanhf(-2.000000) = -0.964028 mytanhl(-2.000000) = -0.964028 mytanh(-1.500000) = -0.905148 mytanhf(-1.500000) = -0.905148 mytanhl(-1.500000) = -0.905148 mytanh(-1.000000) = -0.761594 mytanhf(-1.000000) = -0.761594 mytanhl(-1.000000) = -0.761594 mytanh(-0.500000) = -0.462117 mytanhf(-0.500000) = -0.462117 mytanhl(-0.500000) = -0.462117 mytanh(0.000000) = 0.000000 mytanhf(0.000000) = 0.000000 mytanhl(0.000000) = 0.000000 mytanh(0.500000) = 0.462117 mytanhf(0.500000) = 0.462117 mytanhl(0.500000) = 0.462117 mytanh(1.000000) = 0.761594 mytanhf(1.000000) = 0.761594 mytanhl(1.000000) = 0.761594 mytanh(1.500000) = 0.905148 mytanhf(1.500000) = 0.905148 mytanhl(1.500000) = 0.905148 mytanh(2.000000) = 0.964028 mytanhf(2.000000) = 0.964028 mytanhl(2.000000) = 0.964028 |
まとめ
C言語で双曲線関数のsinh/cosh/tanh関数の使い方と自作関数を紹介しました.
sinh/cosh/tanh関数の自作関数はシンプルなので理解しやすいです.
逆双曲線関数のasinh/acosh/atanh関数の使い方と自作関数を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!