ZeroLoom

C言語 - 基礎知識

October 6, 2024
2 min read
Table of Contents

浮動小数点について


  • C言語における浮動小数点は大部分の環境において IEEE 754(アイ・トリプル・イー 754)という仕様に基づいている
  • C言語で主に使用されるのは 32 ビットと 64 ビットの浮動小数点
  • 浮動小数点は符号・指数・仮数で値を表現する
  • 32 ビット・64 ビットのいずれも、仮数に「2の指数乗」を掛けて符号を付けた値が浮動小数点の値になる
  • 整数を 2 のべき乗で割った値は誤差が生じない

32 ビット浮動小数点

  • 単精度とも呼ばれる
  • 1 ビットの符号、8 ビットの指数、23 ビットの仮数の合計 32 ビットで値を表現する
  • 10 進数で 7.22 桁程度の精度がある
  • C 言語の float 型に対応する
  • 1.210381.2*10^{-38} ~ 3.410383.4*10^{38} の範囲の値を表現できる

64 ビット浮動小数点

  • 倍精度とも呼ばれる
  • 1 ビットの符号、11 ビットの指数、52 ビットの仮数の合計 64 ビットで値を表現する
  • 10 進数で 15.95 桁程度の精度がある
  • C 言語の double 型に対応する
  • 2.2103082.2*10^{-308} ~ 1.8103081.8*10^{308} の範囲の値を表現できる

指数表記について


アボガドロ定数やプランク定数などの桁数が多い値については以下のように表現する

指数表記での指定
#include <stdio.h>
 
int main(void) {
    printf("%.2e\n", 6.02e23);
    printf("%.2e\n", 6.63e-34);
}
指数表記での指定を自動で判定
#include <stdio.h>
 
int main(void) {
    printf("%g\n", 3.14);
    printf("%g\n", 6.02e23);
    printf("%g\n", 6.63e-34);
}

printf 関数における変換指定について


変換指定の構成
#include <stdio.h>
 
// %「フラグ」「最小の桁数」「.精度」「値の長さ」「値の種類(変換指定子)」
// フラグ、最小の桁数、精度、値の長さについては省略可
int main(void) {
    int num = 42;
    double pi = 3.14159265359;
    long int long_num = 123456789;
    unsigned int hex = 0x1A3F;
    char *str = "Hello";
 
    // フラグ: 0(ゼロ埋め), +(符号表示)
    // 最小桁数: 10
    // 精度: .3(小数点以下3桁)
    // 値の長さ: l(long型の指定)
    // 変換指定子: d, f, s, x
    printf("|%+010d|%0*.*f|%-10.5s|%#08x|%10ld|\n", 
            num, 10, 3, pi, str, hex, long_num);
}
結果
|+00000042|000003.142|Hello     |0x00001a3f|  123456789|

フラグの記法

記法動作
-左詰めで出力(デフォルトは右詰め)
+プラスの符号を出力(デフォルトでは出力しない)
#代替の形式で出力(値の種類に応じて動作が異なる)
0最小の桁数未満の部分に0を出力(整数・浮動小数点で右詰めの場合)

値の種類(変換指定子)

記法出力する値の種類
c文字
s文字列
dまたはi符号つき整数(10進数)
u符号なし整数(10進数)
o符号なし整数(8進数)
xまたはX符号なし整数(16進数)
fまたはF浮動小数点(10進数)
eまたはE浮動小数点(10進数、指数表記)
aまたはA浮動小数点(16進数)
gまたはG浮動小数点(10進数、値と精度に応じて表記を切り替え)
pポインタ
nこれまでに出力した文字数を書き込む