C の指数

胡金庫 2023年10月12日
  1. C 言語で指数関数として pow を使用する
  2. C 言語で整数の指数計算にカスタム定義関数を使用する
C の指数

この記事では、C 言語で指数関数を使用する方法について複数の方法を紹介します。

C 言語で指数関数として pow を使用する

関数 pow は C 言語の数学ライブラリの一部であり、<math.h> ヘッダで定義されています。gcc コンパイラツールチェインを利用する際には、数学ライブラリを明示的にリンクする必要があります。コンパイル時に -lm フラグを渡すか、必要に応じて対応するビルドシステムファイルにインクルードする必要があります。pow は浮動小数点数に対してのみ定義されているので、最適な結果を得るためには整数では使用しない方がよい。

以下のサンプルコードでは、単一の double 変数の n 番目の指数を計算する方法を示しています。pow は 2つのパラメータ、すなわち指数化する基底数と指数そのものを受け取ります。pow 関数の結果は計算された数値を返すので、pow 関数の結果を printf 呼び出しに連鎖させることができます。しかし、特定の入力に対しては複数のエラーが発生することに注意してください。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
  double x = 10.0;
  printf("x: %f\n", x);
  printf("x^2: %f\n", pow(x, 2));

  exit(EXIT_SUCCESS);
}

出力:

x: 10.000000
x^2: 100.000000

C 言語で整数の指数計算にカスタム定義関数を使用する

あるいは、積分数の指数関数を計算するためのカスタム関数を定義することもできます。最初に、int 値に対する関数を実装します。実装は非常に簡単で、for ループを使って基底整数を n 倍します。この関数は計算された int 値を返します。この関数は整数型のオーバーフローをチェックしないことに注意してください。ユーザーは、この関数を使用するときにこの事実に注意する必要があります。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int exponentInt(const int base, int n) {
  int i, p = base;
  for (i = 1; i < n; ++i) p *= base;
  return p;
}

int main() {
  int x2 = 10;
  printf("x2: %d\n", x2);
  printf("x2^4: %d\n", exponentInt(x2, 4));

  exit(EXIT_SUCCESS);
}

出力:

x2: 10
x2^4: 10000

これまでの指数関数の実装では、int 型自体が 32 ビットの記憶容量に制限されているため、計算された数値に対して 232-1 までしか計算できないという制限がありました。この制限を拡張するには、unsigned long 型を用いると、対応するシステム上で 64 ビットの空間を持つことになります。したがって、指数関数の計算値は 264-1 まで拡張することができます。この関数は、次の例のように、ある時点でオーバーフローすることに注意してください。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

unsigned long exponentInteger(const unsigned long base, unsigned n) {
  unsigned long i, p = base;
  for (i = 1; i < n; ++i) p *= base;
  return p;
}

int main() {
  int x2 = 10;
  printf("x2: %d\n", x2);
  printf("x2^19: %lu\n", exponentInteger(x2, 19));
  printf("x2^20: %lu\n", exponentInteger(x2, 20));

  exit(EXIT_SUCCESS);
}

出力:

x2: 10
x2^19: 10000000000000000000
x2^20: 7766279631452241920
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Math