6

私はこれをキックのためだけに行いました(正確な質問ではありませんが、ダウンモッディングがすでに起こっていることがわかります)が、Googleが新たに発見した数学を正しく行うことができない代わりに(チェックしてください!Googleによると、500,000,000,000,002 - 500,000,000,000,001 = 0)、私は考えました少し理論を実行するために、Cで次のことを試してみます。

int main()
{
   char* a = "399999999999999";
   char* b = "399999999999998";

   float da = atof(a);
   float db = atof(b);

   printf("%s - %s = %f\n", a, b, da-db);

   a = "500000000000002";
   b = "500000000000001";
   da = atof(a);
   db = atof(b);
   printf("%s - %s = %f\n", a, b, da-db);
}

このプログラムを実行すると、次のようになります

   399999999999999 - 399999999999998 = 0.000000
   500000000000002 - 500000000000001 = 0.000000

Google は単純な 32 ビット浮動小数点精度 (ここでのエラー) を使用しているように見えますが、上記のコードで float を double に切り替えると、問題が解決します! これでしょうか?

/mp

4

7 に答える 7

4

この種の愚かさの詳細については、Windows 電卓に関するこの素晴らしい記事を参照してください。

中身を変えると誰も気付かない

演算エンジンである Calc の内部は完全に破棄され、ゼロから書き直されました。標準の IEEE 浮動小数点ライブラリは、任意精度の算術ライブラリに置き換えられました。これは、人々が Calc が 10 進数の算術演算を正しく行うことができないというハハハ記事を書き続けた後に行われました。

于 2008-08-25T23:19:45.287 に答える
2

Google は単純な 32 ビット浮動小数点精度 (ここでのエラー) を使用しているように見えますが、上記のコードで float を double に切り替えると、問題が解決します! これでしょうか?

いいえ、あなたは問題を先延ばしするだけです。double は、数値が大きいだけで、同じ問題を示します。

于 2008-08-26T08:08:31.007 に答える
2

C# で (double.maxvalue == (double.maxvalue - 100)) を試すと、true が得られます ...

しかし、それはあるべきものです:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

考えてみると、2^64 (double.maxvalue) より大きい数値を表す 64 ビットがあるため、不正確さが予想されます。

于 2008-08-26T08:19:56.813 に答える
1

@ebel

考えてみると、2^64 (double.maxvalue) より大きい数値を表す 64 ビットがあるため、不正確さが予想されます。

2^64 は double の最大値ではありません。2^64 は、double (またはその他の 64 ビット型) が保持できる一意の値の数です。 Double.MaxValue1.79769313486232e308 に等しいです。

浮動小数点数の不正確さは、より大きい値を表すことに起因するものではありませんDouble.MaxValue(これは を除き、不可能ですDouble.PositiveInfinity)。これは、目的の値の範囲が大きすぎてデータ型に収まらないという事実に由来します。そのため、より広い有効範囲と引き換えに精度をあきらめます。本質的には、より大きな指数範囲と引き換えに有効桁数を落としています。

@DrPizza

さえない。IEEE エンコーディングは、同じ値に対して複数のエンコーディングを使用します。具体的には、NaN はすべてのビットが 1 の指数で表され、次に仮数のゼロ以外の値で表されます。そのため、ダブルには 252 個の NaN、シングルには 223 個の NaN があります。

真実。重複したエンコーディングについては説明しませんでした。ただし、実際には doubleには 2 52 -1 NaN があり、single には 2 23 -1 NaN があります。:p

于 2008-08-26T15:46:40.840 に答える
0

私が学んだこの問題の概算バージョンは、32 ビット浮動小数点数では 5 桁の精度が得られ、64 ビット浮動小数点数では 15 桁の精度が得られるということです。もちろん、これはフロートがどのようにエンコードされているかによって異なりますが、これはかなり良い出発点です。

于 2008-09-12T23:14:13.150 に答える
0

真実。エンコーディングの重複は考慮していません。ただし、実際には double には 252-1 NaN、single には 223-1 NaN があります。:p

ああ、無限大を引くのを忘れていました。

于 2008-08-26T21:54:56.667 に答える
0

2^64 は double の最大値ではありません。2^64 は、double (またはその他の 64 ビット型) が保持できる一意の値の数です。Double.MaxValue は 1.79769313486232e308 です。

さえない。IEEE エンコーディングは、同じ値に対して複数のエンコーディングを使用します。具体的には、NaN はすべてのビットが 1 の指数で表され、次に仮数ゼロ以外の値で表されます。そのため、ダブルには 2 52個の NaN があり、シングルには 2 23個の NaN があります。

于 2008-08-26T17:04:32.013 に答える