浮動小数点の四則演算

浮動小数点の四則演算を行いましょう。浮動小数点の足し算・引き算・掛け算・割り算を行います。

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浮動小数点としての本来予想される計算結果と、異なる場合があるということです。

関連情報