C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91735 の関連記事表示

<< 0 >>
■91735  Re[4]: 長い桁数の定数を使用する方法
□投稿者/ 魔界の仮面弁士 -(2019/07/26(Fri) 14:16:53)
    No91732 (kozue さん) に返信
    > https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html
    > Singleは7桁doubleは15桁と書かれてありますが。
    > 3.14159274
    > 3.1415926535897931
    > はそれぞれ9桁と17桁になっています
    ラウンドトリップ文字列と「有効桁数」は別物ですよ。

    > なぜこのような違い見られるのでしょうか?
    Decimal 型が、その名前の通り「10進数」相当の管理を行っているのに対して、
    Single や Double は「2 進数」管理の小数であることはご存知でしょうか。

    Single の有効桁数は、2 進表現で 23+1 桁なので、
    10 進表現では「7.2247198959…桁」にあたります。

    Double の有効桁数は、2 進表現で 52+1 桁なので、
    10 進表現では「15.954589770…桁」にあたります。


    > 3.14159274
    Single の 3.14159274 は、内部的には
     0b0_10000000_10010010000111111101000
    に相当するバイナリとして保持されています。
    これは 10 進数では 3.1415958404541015625 相当の値です。

    要するに、
     (2^1 +2^0 +2^-3 +2^-6 +2^-11 +2^-12 +2^-13 +2^-14 +2^-15 +2^-16 +2^-17 +2^-19)
    ということです。

    バイナリの 0b0_10000000_10010010000111111101000 を
    1 増やして 0b0_10000000_10010010000111111101001 にすると、
    10 進数で 3.1415960788726806640625 相当になります。

    1 減らして 0b0_10000000_10010010000111111100111 にすると、
    10 進数で 3.1415956020355224609375 相当です。

    これら隣り合う三つの値を並べてみると、
     3.1415956020355224609375
     3.1415958404541015625
     3.1415960788726806640625
    となりますよね。なので、元データの有効桁数が 24 bit あっても、
    10進小数としてラウンドトリップする場合、この数値域においては
     3.14159274
    の桁数まであれば、十分に元の Single 値を表現できるというわけです。
記事No.91729 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -