このプログラムの出力を理解するのに問題があります
int main()
{
double x = 1.8939201459282359e-308;
double y = 4.9406564584124654e-324;
printf("%23.16e\n", 1.6*y);
printf("%23.16e\n", 1.7*y);
printf("%23.16e\n", 1.8*y);
printf("%23.16e\n", 1.9*y);
printf("%23.16e\n", 2.0*y);
printf("%23.16e\n", x + 1.6*y);
printf("%23.16e\n", x + 1.7*y);
printf("%23.16e\n", x + 1.8*y);
printf("%23.16e\n", x + 1.9*y);
printf("%23.16e\n", x + 2.0*y);
}
出力は
9.8813129168249309e-324
9.8813129168249309e-324
9.8813129168249309e-324
9.8813129168249309e-324
9.8813129168249309e-324
1.8939201459282364e-308
1.8939201459282364e-308
1.8939201459282369e-308
1.8939201459282369e-308
1.8939201459282369e-308
IEEE演算を使用しています。変数y
は、可能な限り最小のIEEE番号を保持します。最初の5つのプリントは、私が予想する2倍のyの数を示しています。私を混乱させているのは、次の5つのプリントが異なる数字を示していることです。1.6*y
が同じである場合2.0*y
、どのようx + 1.6*y
に異なることができますx + 2.0*y
か?