1

大規模な C プログラミング プロジェクトで数値の問題が発生しています。(これは統計調査であり、クラスの宿題ではありません)。1 つのステップでは、sqrt(x^2 + y) - x を計算します。これは正である必要がありますが、x > 0 かつ y > 0 の場合でも、sqrt(x^2 + y) - x < 0 になることがあります。例:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
  float x = 1210.9088134,
        y = 0.0062529947;

  printf("x =\t\t\t%70.50f\n", x);
  printf("y =\t\t\t%70.50f\n", y);

  printf("x*x =\t\t\t%70.50f\n", x*x);
  printf("x*x + y =\t\t%70.50f\n", x*x + y);
  printf("sqrt(x*x + y) =\t\t%70.50f\n", sqrt(x*x + y));

  printf("sqrt(x*x + y) - x =\t%70.50f\n", sqrt(x*x + y) - x);
}

私の出力:

x =                        1210.90881347656250000000000000000000000000000000000000
y =                           0.00625299476087093353271484375000000000000000000000
x*x =                   1466300.12500000000000000000000000000000000000000000000000
x*x + y =               1466300.12500000000000000000000000000000000000000000000000
sqrt(x*x + y) =            1210.90880127282912326336372643709182739257812500000000
sqrt(x*x + y) - x =          -0.00001220373337673663627356290817260742187500000000

この出力には、奇妙な動作が散らばっています。ハイライト:

  1. y 0.0062529947 を割り当てましたが、0.00625299476087093353271484375 として出力されます。
  2. x*x + y は x*x と同じ値として出力されます。
  3. sqrt(x*x + y) - x < 0.

なぜ 1-3 が発生するのですか?

言及する必要があります: この例は、gcc バージョンの 64 ビット Mac OX 10.9.4 マシンの両方で実行しました。

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

および gcc バージョンの 64 ビット CentOS サーバー:

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

また、コンパイルはどちらのマシンでもエラーや警告を返しませんでした:

$ gcc -lm -Wall -pedantic -ansi test.c -o test
4

0 に答える 0