C言語で逆双曲線関数のasinh/acosh/atanh関数の使い方と自作関数を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴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社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
逆双曲線関数のasinh/acosh/atanh関数
逆双曲線関数のasinh/acosh/atanh関数を紹介します.
asinh/asinhf/asinhl関数
1 2 3 |
double asinh(double x); float asinhf(float x); long double asinhl(long double x); |
asinh/asinhf/asinhl関数は,xの逆双曲線正弦(インバースハイパボリックサイン)を 計算します.
すなわち,その双曲線正弦(ハイパボリックサイン)がxになる値です.
asinh関数は数学的には以下の定義になります.
$${\rm asinh\ } x = \ln (x + \sqrt{x^2 + 1})$$
acosh/acoshf/acoshl関数
1 2 3 |
double acosh(double x); float acoshf(float x); long double acoshl(long double x); |
acosh/acoshf/acoshl関数は,xの逆双曲線余弦(インバースハイパボリックコサイン)を 計算します.
すなわち,その双曲線余弦(ハイパボリックコサイン)がxになる値です.
acosh関数は数学的には以下の定義になります.
$${\rm acosh\ } x = \ln (x + \sqrt{x + 1} \sqrt{x - 1})$$
atanh/atanhf/atanhl関数
1 2 3 |
double atanh(double x); float atanhf(float x); long double atanhl(long double x); |
atanh/atanhf/atanhl関数は,xの逆双曲線正接(インバースハイパボリックタンジェント)を 計算します.
すなわち,その双曲線正接(ハイパボリックタンジェント)がxになる値です.
atanh関数は数学的には以下の定義になります.
$${\rm atanh\ } x = \frac{1}{2} \ln \left( \frac{1 + x}{1 - x} \right)$$
asinh/acosh/atanh関数の使い方
asinh/acosh/atanh関数の使い方を紹介します.
asinh/asinhf/asinhl関数の使い方
asinh/asinhf/asinhl関数の使い方は以下になります.
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(" asinh(%lf) = %lf\n", d, asinh(d)); printf("asinhf(%f) = %f\n", f, asinhf(f)); printf("asinhl(%Lf) = %Lf\n", ld, asinhl(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 asinh.c -lm $ a.out asinh(-2.000000) = -1.443635 asinhf(-2.000000) = -1.443635 asinhl(-2.000000) = -1.443635 asinh(-1.500000) = -1.194763 asinhf(-1.500000) = -1.194763 asinhl(-1.500000) = -1.194763 asinh(-1.000000) = -0.881374 asinhf(-1.000000) = -0.881374 asinhl(-1.000000) = -0.881374 asinh(-0.500000) = -0.481212 asinhf(-0.500000) = -0.481212 asinhl(-0.500000) = -0.481212 asinh(0.000000) = 0.000000 asinhf(0.000000) = 0.000000 asinhl(0.000000) = 0.000000 asinh(0.500000) = 0.481212 asinhf(0.500000) = 0.481212 asinhl(0.500000) = 0.481212 asinh(1.000000) = 0.881374 asinhf(1.000000) = 0.881374 asinhl(1.000000) = 0.881374 asinh(1.500000) = 1.194763 asinhf(1.500000) = 1.194763 asinhl(1.500000) = 1.194763 asinh(2.000000) = 1.443635 asinhf(2.000000) = 1.443635 asinhl(2.000000) = 1.443635 |
acosh/acoshf/acoshl関数の使い方
acosh/acoshf/acoshl関数の使い方は以下になります.
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(" acosh(%lf) = %lf\n", d, acosh(d)); printf("acoshf(%f) = %f\n", f, acoshf(f)); printf("acoshl(%Lf) = %Lf\n", ld, acoshl(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 acosh.c -lm $ a.out acosh(-2.000000) = -nan acoshf(-2.000000) = -nan acoshl(-2.000000) = -nan acosh(-1.500000) = -nan acoshf(-1.500000) = -nan acoshl(-1.500000) = -nan acosh(-1.000000) = -nan acoshf(-1.000000) = -nan acoshl(-1.000000) = -nan acosh(-0.500000) = -nan acoshf(-0.500000) = -nan acoshl(-0.500000) = -nan acosh(0.000000) = -nan acoshf(0.000000) = -nan acoshl(0.000000) = -nan acosh(0.500000) = -nan acoshf(0.500000) = -nan acoshl(0.500000) = -nan acosh(1.000000) = 0.000000 acoshf(1.000000) = 0.000000 acoshl(1.000000) = 0.000000 acosh(1.500000) = 0.962424 acoshf(1.500000) = 0.962424 acoshl(1.500000) = 0.962424 acosh(2.000000) = 1.316958 acoshf(2.000000) = 1.316958 acoshl(2.000000) = 1.316958 |
atanh/atanhf/atanhl関数の使い方
atanh/atanhf/atanhl関数の使い方は以下になります.
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(" atanh(%lf) = %lf\n", d, atanh(d)); printf("atanhf(%f) = %f\n", f, atanhf(f)); printf("atanhl(%Lf) = %Lf\n", ld, atanhl(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 atanh.c -lm $ a.out atanh(-2.000000) = -nan atanhf(-2.000000) = -nan atanhl(-2.000000) = -nan atanh(-1.500000) = -nan atanhf(-1.500000) = -nan atanhl(-1.500000) = -nan atanh(-1.000000) = -inf atanhf(-1.000000) = -inf atanhl(-1.000000) = -inf atanh(-0.500000) = -0.549306 atanhf(-0.500000) = -0.549306 atanhl(-0.500000) = -0.549306 atanh(0.000000) = 0.000000 atanhf(0.000000) = 0.000000 atanhl(0.000000) = 0.000000 atanh(0.500000) = 0.549306 atanhf(0.500000) = 0.549306 atanhl(0.500000) = 0.549306 atanh(1.000000) = inf atanhf(1.000000) = inf atanhl(1.000000) = inf atanh(1.500000) = -nan atanhf(1.500000) = -nan atanhl(1.500000) = -nan atanh(2.000000) = -nan atanhf(2.000000) = -nan atanhl(2.000000) = -nan |
asinh/acosh/atanh関数の自作関数
asinh/acosh/atanh関数の自作関数を紹介します.
コードが冗長にならないようにするために,自作関数では以下の関数を利用しています.
これらの自作関数を知りたいあなたはこちらからどうぞ.
asinh/asinhf/asinhl関数の自作関数
asinh/asinhf/asinhl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 double myasinh(double x) { return log(x + sqrt(x * x + 1)); } float myasinhf(float x) { return logf(x + sqrtf(x * x + 1)); } long double myasinhl(long double x) { return logl(x + sqrtl(x * x + 1)); } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" myasinh(%lf) = %lf\n", d, myasinh(d)); printf("myasinhf(%f) = %f\n", f, myasinhf(f)); printf("myasinhl(%Lf) = %Lf\n", ld, myasinhl(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 myasinh.c -lm $ a.out myasinh(-2.000000) = -1.443635 myasinhf(-2.000000) = -1.443635 myasinhl(-2.000000) = -1.443635 myasinh(-1.500000) = -1.194763 myasinhf(-1.500000) = -1.194763 myasinhl(-1.500000) = -1.194763 myasinh(-1.000000) = -0.881374 myasinhf(-1.000000) = -0.881374 myasinhl(-1.000000) = -0.881374 myasinh(-0.500000) = -0.481212 myasinhf(-0.500000) = -0.481212 myasinhl(-0.500000) = -0.481212 myasinh(0.000000) = 0.000000 myasinhf(0.000000) = 0.000000 myasinhl(0.000000) = 0.000000 myasinh(0.500000) = 0.481212 myasinhf(0.500000) = 0.481212 myasinhl(0.500000) = 0.481212 myasinh(1.000000) = 0.881374 myasinhf(1.000000) = 0.881374 myasinhl(1.000000) = 0.881374 myasinh(1.500000) = 1.194763 myasinhf(1.500000) = 1.194763 myasinhl(1.500000) = 1.194763 myasinh(2.000000) = 1.443635 myasinhf(2.000000) = 1.443635 myasinhl(2.000000) = 1.443635 |
acosh/acoshf/acoshl関数の自作関数
acosh/acoshf/acoshl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 double myacosh(double x) { return log(x + sqrt(x + 1) * sqrt(x - 1)); } float myacoshf(float x) { return logf(x + sqrtf(x + 1) * sqrtf(x - 1)); } long double myacoshl(long double x) { return logl(x + sqrtl(x + 1) * sqrtl(x - 1)); } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" myacosh(%lf) = %lf\n", d, myacosh(d)); printf("myacoshf(%f) = %f\n", f, myacoshf(f)); printf("myacoshl(%Lf) = %Lf\n", ld, myacoshl(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 myacosh.c -lm $ a.out myacosh(-2.000000) = -nan myacoshf(-2.000000) = -nan myacoshl(-2.000000) = -nan myacosh(-1.500000) = -nan myacoshf(-1.500000) = -nan myacoshl(-1.500000) = -nan myacosh(-1.000000) = -nan myacoshf(-1.000000) = -nan myacoshl(-1.000000) = -nan myacosh(-0.500000) = -nan myacoshf(-0.500000) = -nan myacoshl(-0.500000) = -nan myacosh(0.000000) = -nan myacoshf(0.000000) = -nan myacoshl(0.000000) = -nan myacosh(0.500000) = -nan myacoshf(0.500000) = -nan myacoshl(0.500000) = -nan myacosh(1.000000) = 0.000000 myacoshf(1.000000) = 0.000000 myacoshl(1.000000) = 0.000000 myacosh(1.500000) = 0.962424 myacoshf(1.500000) = 0.962424 myacoshl(1.500000) = 0.962424 myacosh(2.000000) = 1.316958 myacoshf(2.000000) = 1.316958 myacoshl(2.000000) = 1.316958 |
atanh/atanhf/atanhl関数の自作関数
atanh/atanhf/atanhl関数の自作関数は以下になります.
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 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> #define MAX 2 #define STEP 0.5 double myatanh(double x) { return 0.5 * log((1 + x) / (1 - x)); } float myatanhf(float x) { return 0.5 * logf((1 + x) / (1 - x)); } long double myatanhl(long double x) { return 0.5 * logl((1 + x) / (1 - x)); } int main(void) { long double ld; double d; float f; for (ld = -MAX; ld <= MAX; ld += STEP) { d = f = ld; printf(" myatanh(%lf) = %lf\n", d, myatanh(d)); printf("myatanhf(%f) = %f\n", f, myatanhf(f)); printf("myatanhl(%Lf) = %Lf\n", ld, myatanhl(ld)); } return 0; } |
実行結果は以下になります.
atanh関数と比較すると符号が若干異なりますが,ほぼ同様です.
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 myatanh.c -lm $ a.out myatanh(-2.000000) = -nan myatanhf(-2.000000) = -nan myatanhl(-2.000000) = nan myatanh(-1.500000) = -nan myatanhf(-1.500000) = -nan myatanhl(-1.500000) = nan myatanh(-1.000000) = -inf myatanhf(-1.000000) = -inf myatanhl(-1.000000) = -inf myatanh(-0.500000) = -0.549306 myatanhf(-0.500000) = -0.549306 myatanhl(-0.500000) = -0.549306 myatanh(0.000000) = 0.000000 myatanhf(0.000000) = 0.000000 myatanhl(0.000000) = 0.000000 myatanh(0.500000) = 0.549306 myatanhf(0.500000) = 0.549306 myatanhl(0.500000) = 0.549306 myatanh(1.000000) = inf myatanhf(1.000000) = inf myatanhl(1.000000) = inf myatanh(1.500000) = -nan myatanhf(1.500000) = -nan myatanhl(1.500000) = nan myatanh(2.000000) = -nan myatanhf(2.000000) = -nan myatanhl(2.000000) = nan |
まとめ
C言語で逆双曲線関数のasinh/acosh/atanh関数の使い方と自作関数を紹介しました.
asinh/acosh/atanh関数の自作関数はシンプルなので理解しやすいです.
双曲線関数のsinh/cosh/tanh関数の使い方と自作関数を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!