Cの無限大
このチュートリアルでは、C の無限について説明します。一般的な無限についての説明から始めます。
次に、C の実行時エラーとしての無限について説明し、C での無限の格納と使用についての説明で締めくくります。
インフィニティとは
私たちは皆、小学校から数直線を知っています。 この数直線は、終わりも始まりもない矢印で表されます。
ただし、理論的には、両方を持っています。 数値は正の無限大 ∞
(+∞
と表記されることもあります) で終わり、負の無限大 -∞
から始まります。
すべての実数 x
は – ∞ < x < ∞
の間にあります。 無限とは、重みが記述可能な限界を超えている数を指します。
無限の数があると言うとき、これは無限の数があることを意味します。
物を分割すると、実際の物の断片または部分が得られることは誰もが知っています。 仕切りが小さければ小さいほど、より多くのピースがあります。
より多くの断片を得るには、物事をより小さな断片に分割する必要があります。 したがって、ゼロに近づくものを割ると、無限個(数えられない個)になります。
逆に、実数を無限大で割ると、限られた量を無限個に分配するのと同じであるため、結果はゼロになります。 したがって、各ピースはほぼゼロのシェアを獲得します。
プログラミングの無限大
通常、プログラマーは無限大に関する典型的な問題を抱えています。 式の除算器が (通常は誤って) ゼロになると、プログラムがクラッシュします (異常終了)。
生命にかかわるソフトウェアにとって、異常終了は重大な問題になる可能性があります。 プログラマーは異常終了を望んでいません。 これにより、if-else
チェックが使用されるか、例外処理が実行されます。
簡単なコードを考えてみましょう:
#include <stdio.h>
int main() {
printf("%d\n", 5 / 0);
printf("\nEnd of program\n");
return 0;
}
このプログラムでは、ハードコーディングされた 5
と 0
の除算を使用して、プログラムの動作をチェックしています。 ただし、プログラマーが変数を除算器として使用し、その値が何らかの理由でゼロになる場合があります。 Programiz C オンライン コンパイラ で試したところ、以下の出力が得られました。
Floating point exception
別の オンライン コンパイラ で同じコードを試しました。出力は以下のとおりです。
main.c: In function ‘main’:
main.c:3:23: warning: division by zero [-Wdiv-by-zero]
3 | printf ("%d\n", 5 / 0);
| ^
このプログラムは、最初の print
ステートメントで終了 (クラッシュ) します。 別の print
ステートメントがありますが、これはプログラムが既に終了しているため (異常終了と呼ばれます)、実行されません。
Cにおける無限の表現
C では、無限大は INF
または inf
で表されます。 通常、これはゼロまたはヌル値による除算の結果です。
次のコード例を参照してください。
#include <math.h>
#include <stdio.h>
double divide(double d1, double d2) { return d1 / d2; }
int main() {
printf("Result: %lf\n", divide(2, 3));
printf("Result: %lf\n", divide(2, 0));
return 0;
}
コードには 2つの print
ステートメントがあります。 最初の print
ステートメントでゼロ以外のパラメーターを指定して関数を呼び出しますが、2 番目の print
呼び出しでは 2 番目のパラメーターはゼロです。
出力:
Result: 0.666667
Result: inf
状況は最初のコードに似ているかもしれません。 ただし、少し異なります。 最初のコードでは、print
ステートメント内に (ゼロで除算した) 式があり、その結果、プログラムが異常終了します。
ただし、この 2 番目のプログラムは main()
関数から divide
関数を呼び出します。 divide
関数は、main
関数からの呼び出しの結果として inf
を返し、それに応じて出力します。
main
関数の変数に結果を格納すると、同じ結果が得られます。
#include <math.h>
#include <stdio.h>
double divide(double d1, double d2) { return d1 / d2; }
int main() {
double result = divide(2, 0);
printf("Result: %lf\n", result);
return 0;
}
結果として inf
を取得するだけでなく、結果を無限大と比較することもできます。 次の指示は、式の値に基づいている可能性があり、多くの場合、無限の結果の場合、処理を続行する必要はありません。
したがって、次の命令を実行する前に値を確認する必要があります。
この目的のために、結果が無限大かどうかをチェックする関数 isinf
があります。 例を参照してください。
#include <math.h>
#include <stdio.h>
double divide(double x, double y) { return x / y; }
int main() {
double res = divide(7, 3);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
res = divide(7, 0);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
return 0;
}
結果を無限大と比較するために、結果を isinf
関数に渡す if
ステートメントに注意してください。 res
の値が無限大の場合、printf
ステートメントをスキップします。
出力:
Result is 2.33333
The result is infinity, and further computations not possible
無限の結果の場合、これ以上先に進めないことが出力から明らかです。 ただし、プログラムは異常終了していません。 いずれにせよ、プログラマーは必要なデータを保存したり、ログを書き込んだりできます。
C の負の無限大
C にも負の無限大があります。たとえば、無限大に負の数を掛けると、結果は負の無限大になります。
次の簡単なコードを参照してください。
#include <math.h>
#include <stdio.h>
int main() {
double res = -1 * INFINITY;
printf("Result is %lf\n", res);
return 0;
}
このコードの出力は Result is -inf
です。 -INFINITY
操作を理解するために別の例を見てみましょう。
#include <math.h>
#include <stdio.h>
double divide(double x, double y) { return x / y; }
int main() {
double res = divide(7, 3);
if (!isinf(res))
printf("Result is %lf\n", res);
else
printf("The result is infinity, and further computations not possible\n");
res = divide(-7, 0);
if (res != -INFINITY)
printf("Result is %lf\n", res);
else
printf(
"The result is negative infinity, and further computations not "
"possible\n");
return 0;
}
ここで、divide
関数への 2 番目の関数呼び出しは、負の数を 0 で割るように要求し、それによって負の無限大に等しい値を返します。
出力:
Result is 2.33333
The result is negative infinity, and further computations not possible
このチュートリアルでは、両方の側面について説明しました。 最初に、無限の結果が発生した場合にプログラムを異常終了から救う方法について説明しました。
その後、プログラムが無限をさらに操作して、無限値を含む条件式を作成する方法をさらに調べました。