浮動小数点の四則演算
浮動小数点の四則演算を行いましょう。浮動小数点の足し算・引き算・掛け算・割り算を行います。
double型を使った64bit浮動小数点の四則演算
double型を使った64bit浮動小数点の四則演算です。浮動小数点を出力する場合は、フォーマット指定子には「%f」を使います。
#include <stdio.h> int main(void) { double num1 = 1.45; double num2 = 4.67; // 足し算 double num_add = num1 + num2; // 引き算 double num_sub = num1 - num2; // 掛け算 double num_mul = num1 * num2; // 割り算 double num_div = num1 / num2; printf("Add %f\n", num_add); printf("Subtract %f\n", num_sub); printf("Multiply %f\n", num_mul); printf("Division %f\n", num_div); }
出力結果。
Add 6.120000 Subtract -3.220000 Multiply 6.771500 Division 0.310493
float型を使った32bit浮動小数点の四則演算
float型を使った32bit浮動小数点の四則演算です。浮動小数点リテラルのfサフィックスを使って、float型にしています。浮動小数点を出力する場合は、フォーマット指定子には「%f」を使います。
#include <stdio.h> int main(void) { float num1 = 1.45f; float num2 = 4.67f; // 足し算 float num_add = num1 + num2; // 引き算 float num_sub = num1 - num2; // 掛け算 float num_mul = num1 * num2; // 割り算 float num_div = num1 / num2; printf("Add %f\n", num_add); printf("Subtract %f\n", num_sub); printf("Multiply %f\n", num_mul); printf("Division %f\n", num_div); }
出力結果。
Add 6.120000 Subtract -3.220000 Multiply 6.771500 Division 0.310493
浮動小数点演算の特徴
浮動小数点演算の特徴です。
正確な値ではなく誤差が存在する
浮動小数点は、2進数で表現できる数を除いて、内部的には誤差が発生しています。
たとえば、0.5, 0.25, 0.125などは、2進数で0.1, 0.01, 0.001と表現できますから、誤差はありませんが、そうではない数の場合は、数学で扱う正確な値とは誤差が発生しています。
浮動小数点演算は0除算してもエラーにならない
浮動小数点演算は、整数演算と異なり、0除算しても、エラーになりません。nan(Not A Number)と呼ばれる値が設定されます。整数除算のように計算前にチェックする必然性はありません。
無限大という値を表現できる
doubleやfloatで表現できる値の最大値を超えた場合は、Infと呼ばれる無限大の値が設定されます。符号に応じて、正の無限大、負の無限大があります。
同じ0でも、符号が異なる0が存在する
同じ0でも、符号が正の0と符号が負の0が存在します。正の0と負の0は、比較演算では、等価とみなされますが、内部表現が異なり、それを意識する演算では異なる結果になります。
CPUによって計算結果が異なる場合がある
double型は64bit浮動小数点を表現しますが、実はCPUは、64bitの精度を超えて、計算している場合があります。ひとつの例として、IntelのCPUは、80bitの浮動小数点計算用の領域を持ちます。
つまり、64bit浮動小数点としての本来予想される計算結果と、異なる場合があるということです。