/* error_cancellation1.c 桁落ち [1 / n - 1 / (n + 1)] * (n * (n + 1)) = 1 のはずが ... */ #include int main() { int n, i; float x, y, z, w; n = 10; for(i = 0; i < 8; i++){ x = 1.0 / n; y = 1.0 / (n + 1); z = x - y; w = z * (n * (n + 1.0)); printf("n = %9d のとき [1/n-1/(n+1)]*(n*(n+1)) = %f\n", n, w); n *= 10; } } /* n = 10 のとき [1/n-1/(n+1)]*(n*(n+1)) = 1.000000 n = 100 のとき [1/n-1/(n+1)]*(n*(n+1)) = 0.999999 n = 1000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 1.000075 n = 10000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 0.999817 n = 100000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 1.000454 n = 1000000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 1.023183 n = 10000000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 1.421086 n = 100000000 のとき [1/n-1/(n+1)]*(n*(n+1)) = 0.000000 */