++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

decimal

leave a comment »

decimal は小数点位置が変わるって意味では浮動小数点ですよ。float とか double みたいな規格のある形式じゃないだけで(いわゆる IEEE 754 規格)。

decimal で 0.1 が正確に表せるのは、基数が 10 だから。

  • 符号 sign: 1 ビット(0 なら正、1 なら負)
  • 仮数部 fraction:96 ビット(12バイト)の2進数
  • 指数部 exponent: 5ビット(フルには使ってなくて、0~28(0x1C)まで)

として、

sign × fraction × (10 の −exponent 乗)

で値を計算するみたいです。この計算式は MSDN ライブラリにも説明が書かれています。(確か、.NET 1.0 のヘルプにはこの説明なくて、しかも「固定小数点だ」とか書かれてたんですよね。それで色々混乱招いたり。)

ちなみに:

  • 内部的には 128 ビット(16 バイト)確保してる
    • 最上位ビットが sign
    • 上から 4~7 ビット目が exponent (sign との間に 2 ビット使ってないビットがある)
    • 下の 12 バイトが  fraction (exponent との間に 2 バイト使ってないビットがある)
    • IEEE 754 みたいな正規化は全くしない
  • 2 の 96 乗は 79228162514264337593543950336 (10 進数で 28 桁)
    • 指数部が 10 の 0 乗~ −28 乗までなので、decimal で表現できる数字は 10 進で −28 ~ 28 桁
  • float/double と違って、無限大はない
    • オーバーフローは OverflowException 起こす
  • 0x1C00000000000000 (仮数部 0、指数部 28)は 0 と同じ扱い
広告

Written by ufcpp

2010年2月3日 @ 01:20

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。