最終更新日 2025年10月31日
■16進数と10進数で足し算の結果が変わる
注:LP64-gcc環境とします。
#include <stdio.h>
int main(void){
printf("%lx\n",0xFFFFffff+1);
printf("%lx\n",4294967295+1);
}./a.out
0
100000000筆者も間違えました
■浮動小数点は足し算の順番で結果が変わる
#include <float.h>
#include <stdio.h>
int main(void)
{
long double ゴジラ = FLT_MAX; // 巨大
long double 人間 = 1.0L; // 比較的小さな数
long double コング = -FLT_MAX; // 巨大
long double 人間踏まれる = ゴジラ + 人間 + コング ;
long double 人間生きてる = ゴジラ + コング + 人間 ;
printf("人間踏まれる = %.20Lf\n", 人間踏まれる);
printf("人間生きてる = %.20Lf\n", 人間生きてる);
}./a.out
人間踏まれる = 0.00000000000000000000
人間生きてる = 1.00000000000000000000この例を簡単に例えると、
人間踏まれるの計算では
ゴジラ対人間は、人間が踏まれて誤差に丸め込まれます。
人間生きてるの計算では
ゴジラ対コングは0になり、後から人間を足すので1.0が残ります。
■ += が + より好ましい理由
//sum += x が sum = sum + x より好ましい理由
int Long_and_complex_expressions = 0;
#include <stdio.h>
void OK(void){
int sum = 0;
for(int i = 1;i<=10;i++){
sum += i;
}
printf("OK:sum = %d\n",sum);
}
void NG(void){
int Long_and_complex_expressions_sum = 0;
for(int i = 1;i<=10;i++){
Long_and_complex_expressions_sum
= Long_and_complex_expressions + i;
}
printf("NG:sum = %d\n",Long_and_complex_expressions_sum);
}
int main(void){
OK();
NG();
}./a.out
OK:sum = 55
NG:sum = 10