[C言語] Cパズルブック 2.2.2-3 整数と浮動小数点数の型変換 IEEE754

『Cパズルブック』(Alan R.Feuer, 1985)
[Mac M2 Pro 12CPU, macOS Ventura 13.3.1, clang 14.0.3]

問2.2.2-3のコードと出力は以下の通りです。

doubleからfloatへの変換で最終桁が3から2に変わっていますが、これは64ビットから32ビットへの精度低下によるものです。

各変数がメモリにどう格納されているのかLLDBデバッガで確認しました。doubleとfloatはIEEE754内部表現に変換されて格納されています。ちなみにIEEEは米国電気電子学会を指します。

#include "stdio.h"

#define PR(x) printf("x = %.8g\t", (double)x)
#define NL putchar('\n')
#define PRINT4(x1, x2, x3, x4) PR(x1); PR(x2); PR(x3); PR(x4); NL

int main() {
    double d;
    float f;
    long l;
    int i;

    d = f = l = i = 100/3;
    // (d = (f = (l = (i = (100/3)))))
    // (d = (f = (l = (i = 33))))
    // (d = (f = (l = (integer)33))) and i=33
    // (d = (f = (long)33)) and l=33
    // (d = (float)33) and f=33
    // ((double)33) and d=33
    PRINT4(i, l, f, d);

    l = i = f = d = 100/3.;
    // (l = (i = (f = (d = (100/3)))))
    // (l = (i = (f = (d = 33))))
    // (l = (i = (f = (double)33))) and d=33.333333
    // (l = (i = (float)33)) and f=33.333332
    // (l = (integer)33) and i=33
    // ((long)33) and l=33
    PRINT4(i, l, f, d);

    return 0;
}
x = 33	x = 33	x = 33	x = 33	
x = 33	x = 33	x = 33.333332	x = 33.333333	

double d : 4040aaaaaaaaaaab (IEEE754内部表現) = 33.333333
float f : 42055555 (IEEE754内部表現) = 33.333332
int i : 21 (16進数) = 33
long l : 21 (16進数) = 33
※格納方式はリトルエンディアンのため右から読む