のような無理数があるとし\sqrt{3}
ます。これは無理数なので、10 進表現はありません。したがって、IEEE 754 double で表現しようとすると、エラーが発生します。
桁数の多い 10 進数表現は次のとおりです。
1.7320508075688772935274463415058723669428052538103806280558069794519330169088
00037081146186757248575675...
今、私が計算する\sqrt{3}
と、次のようになります1.732051
:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
int main() {
double myVar = sqrt (3);
printf("as double:\t%f\n", myVar);
}
Wolfram|Alphaによると、 のエラーがあり1.11100... × 10^-7
ます。
エラーを自分で計算する方法はありますか?
(C++、Python、またはJavaに切り替えてもかまいません。単純な代替手段がなければ、Mathematica を使用することもできます)
明確にするために: sqrt{3} に対してのみ機能するソリューションは必要ありません。任意の数値のエラーを返す関数を取得したいと思います。それが不可能な場合は、少なくとも Wolfram|Alpha がより多くの値を取得する方法を知りたいです。
私の試み
この質問を書いているときに、私はこれを見つけました:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h> // needed for higher precision
int main() {
long double r = sqrtl(3.0L);
printf("Precision: %d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
}
これで、 Wolfram|Alpha2.0 * 10^-18
に従ってエラーを取得できます。したがって、これはエラーの適切な推定を得るのに十分近いと思いました。私はこれを書きました:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h>
int main() {
double myVar = sqrt (3);
long double r = sqrtl(3.0L);
long double error = abs(r-myVar) / r;
printf("Double:\t\t%f\n", myVar);
printf("Precision:\t%d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
printf("Error:\t\t%.*Lg\n", LDBL_DIG, error);
}
しかし、それは出力します:
Double: 1.732051
Precision: 18 digits; 1.73205080756887729
Error: 0
エラーを取得するにはどうすれば修正できますか?