Visual Studio 2008 が .9 - .8999999999999995 = 0.00000000000000055511151231257827 と表示するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1662600

質問

これを Visual Studio 2008 のイミディエイト ウィンドウに入力すると、次のようになります。

? .9 - .8999999999999995

それは私に答えとしてこれを与えます:

0.00000000000000055511151231257827

ドキュメントには、double の精度は 15 ~ 16 桁と記載されていますが、結果は 32 桁の精度になります。その余分な精度はどこから来ているのでしょうか?

役に立ちましたか?

解決

はあり答えでの唯一の15から16桁の数字です。これらすべての先行ゼロはカウントされません。数がより5.5511151231257827×10 -16 のように実際にあります。仮数部は、その中の15〜16桁の数字を持っています。指数(-16)は16体の場所によって小数点にわたってシフトするものであり、全体的な数の桁数を変更しない。

編集

いくつかのコメントを取得した後、私は本当に何が起こっているのかについて、今興味があります。私は、この IEEE-754コンバータのに問題の数を差し込みます。それは「30」に最後の「27」を丸めるの自由を取ったが、私はそれが結果を変えないと思います。

変換器は、その三のバイナリ部分に番号を分解します

のサイン:0(正)
指数:-51
仮:1.0100000000000000000000000000000000000000000000000000(バイナリ1.25 <サブ> 10

したがって、この数は、1.01 2 ×2 -51 、または1.25 <サブ> 10 ×2 -51 です。唯一の3つの重要なバイナリ桁が格納されているがあるので、それはラースが何かにあり得ることを示唆しています。彼らは数が変換されるたびに同じであるため、彼らは、「ランダムノイズ」にすることはできません。

データは、格納された数字が「5」であることを示唆しています。先行ゼロは指数から来て、一見ランダム数字の残りの部分は、2 -51 の計算からのものである。

他のヒント

あなたは読んでください:<のhref = "http://www.google.com/url?sa=t&source=web&ct=res&cd=2&ved=0CBMQFjAB&url=http%3A%2F%2Fdlc.sun.com%2Fpdf% 2F800-7895%2F800-7895.pdf&EI = pRjvSpucFNDKlAe5z7H_BA&USG = AFQjCNFqeDj_vhcrQrnZ_zytDsczXO85fw&SIG2 = LQ1EROQQV6k7cX90ufFyMg」のrel = "nofollowをnoreferrer">何すべてのコンピュータ科学者がすべき 浮動小数点演算について知っ のます。

基本的には浮動小数点数が有限の精度で保存されるまで来ます。あなたは、いくつかのデルタを使用して比較を行う必要があります。

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

先行ゼロは、精度の有意/一部ではない(限り浮動小数点数に関しては - 数学的に言えば、彼らは重要です)。先行ゼロは、浮動小数点数の内部表現の指数部に起因している。

又は仮数の場合)15-16桁に十分に近いである、17桁を有する。

55511151231257827

@Lars D:あなたが正しいことを考える何を、のコンテキスト内での問題の唯一の正しいです。 .9 - .8999999999999995は0.625と-50の指数仮数とフロートということになります。 5.5511151231257827e-16 0.625 * 2 -50 結果を取ります。今、元の質問の文脈の外に、私たちはを17桁で番号を持っているの0.0000000000000005の最善のバイナリ近似ことが起こるん。しかしながら、これらの先行ゼロは限り浮動小数点数の表現が関係しているように依然として有意ではない。

  

? 0.9から0.8999999999999995

この減算処理は、15〜16桁の有効数字と、得られる

  

0.0000000000000005

の数字の残りの部分は、単にエラーを丸めています。しかし、最初の非ゼロ桁の後にコンピュータが常に店舗15〜16桁をするので、丸め誤差が示され、そしてあなたは、丸め誤差によって生成ランダムな数字を末尾の多くを得るいます。その結果は、減算演算から16桁の有効数字に加えて32桁を与える結果の記憶装置から16桁を有している。

「浮動小数点」の「浮動小数点」部分は、5.5511151231257827 * 10^(-16) に近い値を取得していることを意味します。もちろん内部ではすべてバイナリで行われるため、これは正確な表現方法ではありませんが、重要なのは、数値は有効数字と、基数 (小数点) をどれだけ移動するかを表す数値で表されるということです。いつものように、ウィキペディアでさらに詳しい情報が得られます。

(2 番目のリンクは、特定のケースに具体的に焦点を当てています。)

私はそれが2で割り切れるものではなく、その後、どのようなマークRushakoffが言ったことは適用されるように、そのためには、バイナリシステムでは、5が周期的であると考えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top