C言語で浮動小数点数の剰余演算ができるfmod/remainder関数の使い方を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴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,Verse(UEFN), 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言語で剰余演算子(%)を利用すれば整数で剰余演算ができます.
しかし,浮動小数点数(実数)では剰余演算子で剰余演算はできません.
そこで,本記事ではC言語で浮動小数点数の剰余演算ができるfmod/remainder関数の使い方を紹介します.
まずは整数の剰余演算を知りたいあなたはこちらからどうぞ.
目次
C言語の浮動小数点数で剰余演算子(%)を利用
C言語の浮動小数点数で剰余演算子(%)を利用したコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> int main(void) { double x, y; float fx, fy; long double lx, ly; x = fx = lx = 3.0; y = fy = ly = 1.6; printf("%lf %% %lf = %lf\n", x, y, x % y); printf("%f %% %f = %f\n", fx, fy, fx % fy); printf("%Lf %% %Lf = %Lf\n", lx, ly, lx % ly); return 0; } |
コンパイル結果は以下になります.
コンパイルエラーになってしまいました.
1 2 3 4 5 6 7 8 9 10 11 |
$ gcc mod.c mod.c: In function 'main': mod.c:16:40: error: invalid operands to binary % (have 'double' and 'double') 16 | printf("%lf %% %lf = %lf\n", x, y, x % y); | ^ mod.c:17:40: error: invalid operands to binary % (have 'float' and 'float') 17 | printf("%f %% %f = %f\n", fx, fy, fx % fy); | ^ mod.c:18:43: error: invalid operands to binary % (have 'long double' and 'long double') 18 | printf("%Lf %% %Lf = %Lf\n", lx, ly, lx % ly); | |
fmod関数
1 2 3 |
double fmod(double x, double y); float fmodf(float x, float y); long double fmodl(long double x, long double y); |
fmod関数と派生関数を紹介します.
fmod/fmodf/fmodl関数は,xをyで割った浮動小数点剰余を計算します.
返り値はx-n*yです(nはx/yの商を0に近い方に丸めたものです).
fmod/fmodf/fmodl関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> int main(void) { double x, y; float fx, fy; long double lx, ly; x = fx = lx = 3.0; y = fy = ly = 1.6; printf(" fmod(%lf, %lf) = %lf\n", x, y, fmod(x, y)); printf("fmodf(%f, %f) = %f\n", fx, fy, fmodf(fx, fy)); printf("fmodl(%Lf, %Lf) = %Lf\n", lx, ly, fmodl(lx, ly)); return 0; } |
実行結果は以下になります.
3/1.6=1.875なのでn=1となり,返り値は3-1*1.6=1.4になりました.
浮動小数点数で剰余演算ができることがわかりました.
1 2 3 4 5 |
$ gcc fmod.c -lm $ a.out fmod(3.000000, 1.600000) = 1.400000 fmodf(3.000000, 1.600000) = 1.400000 fmodl(3.000000, 1.600000) = 1.400000 |
remainder関数
1 2 3 |
double remainder(double x, double y); float remainderf(float x, float y); long double remainderl(long double x, long double y); |
remainder関数と派生関数を紹介します.
remainder/remainderf/remainderl関数は,浮動小数点数xをyで割った余りを計算します.
返り値はx-n*yです(nはx/yの値を最も近い整数に丸めたもの).
x-n*yの絶対値が0.5の場合,偶数になるようにnが選ばれます.
remainder/remainderf/remainderl関数の使い方は以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <math.h> int main(void) { double x, y; float fx, fy; long double lx, ly; x = fx = lx = 123.45; y = fy = ly = 6.7; printf(" remainder(%lf, %lf) = %lf\n", x, y, remainder(x, y)); printf("remainderf(%f, %f) = %f\n", fx, fy, remainderf(fx, fy)); printf("remainderl(%Lf, %Lf) = %Lf\n", lx, ly, remainderl(lx, ly)); return 0; } |
実行結果は以下になります.
3/1.6=1.875なのでn=2となり,返り値は3.0-2*1.6=-0.2になりました.
fmod関数と結果が異なりますので注意して下さい.(同じ結果になる場合もあります.)
1 2 3 4 5 |
$ gcc remainder.c -lm $ a.out remainder(3.000000, 1.600000) = -0.200000 remainderf(3.000000, 1.600000) = -0.200000 remainderl(3.000000, 1.600000) = -0.200000 |
まとめ
C言語で浮動小数点数の剰余演算ができるfmod/remainder関数の使い方を紹介しました.
浮動小数点数で剰余演算をしたい時に利用しましょう!
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!