- PR -

[基礎]固定小数と浮動小数について

投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-13 11:12
はにまるです。

 
[非 .net] VBAで機種依存文字のチェック

 固定小数と浮動小数の話が上がったので
 スレッドを新規で上げました。

 追記は別途します。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-02-13 11:29
引用:

NAL-6295さんの書き込み (2004-02-13 11:13) より:
いや、固定少数点で正解ですよ。


はにまるさんの仰る浮動小数というのは、通常の2進数の浮動小数の、基数を10にしたようなもののことだと思いますよ。
内部表現でいうと、「仮数部10進数、指数部10のべき乗」みたいな感じのやつです。
これだと、当然有効桁数の考えはありますが、2進数で表現できない数値に対する誤差というものがなくなりますし、固定小数とは違い、ある程度の範囲の数値を表現できます。
むか〜しむかし、BASICで使った記憶が…
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-13 11:29
ほむらです。
-------
ずっと疑問に思っていたのですけど
>double型の0.0001を1万回足したら何になるか質問して見てください。
って結局いくつになるのですか?
正規化して0.1×10の-3乗になって
0.1が2進数では無理数だから。。。。

IEEE形式で考えると
符号ビット:0
指数部:1111111100
仮数部:1111.....
ですよね?

これを一万回足す?。。。プスプス(ボン!

#思わず2の補数にしてしまったので修正

[ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-13 11:40 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-13 11:39
引用:

なちゃさんの書き込み (2004-02-13 11:29) より:
引用:

NAL-6295さんの書き込み (2004-02-13 11:13) より:
いや、固定少数点で正解ですよ。


はにまるさんの仰る浮動小数というのは、通常の2進数の浮動小数の、基数を10にしたようなもののことだと思いますよ。
内部表現でいうと、「仮数部10進数、指数部10のべき乗」みたいな感じのやつです。
これだと、当然有効桁数の考えはありますが、2進数で表現できない数値に対する誤差というものがなくなりますし、固定小数とは違い、ある程度の範囲の数値を表現できます。
むか〜しむかし、BASICで使った記憶が…



NAL-6295です。

正解です。以降の

引用:

例えば・・・
Cだともともと固定少数点型などは存在しません。
じゃあ、どうするのかといったら、
整数型のある位を少数点と決めて、あとは

引用:


計算や利用時には10のべき乗計算をする形式の方です。





のとおりです。
いってみれば、ソロバンの位取りの概念です。

浮動小数点と固定少数点の差は、この位取りが

固定されているか浮動(不定)か

の違いです。



の部分で、指摘されている事について説明しているつもりでした。
ちょっと乱暴な説明でしたが。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-13 11:40 ]
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-13 11:41
こんにちわ。

これって要するに「型」の話ですよね・・・

VBの固定小数型は、通貨型 (Currency) と小数型 (Decimal) です。

[MSDN]
プログラム内部では、スケール付き整数型は、小数値を 10 という因数で乗算した整数として表します。


通貨型は 8 バイトのメモリを必要とし、数値を 15 桁の整数部分と 4 桁の小数部分で表し、–922,337,203,685,477.5808 〜 922,337,203,685,477.5807 の範囲の値をとります。

小数型は 12 バイトのメモリを必要とし、0 〜 28 桁の小数をとります。小数型は、バリアント型 (Variant) のサブタイプです。小数型を使用するには、変数をバリアント型として宣言し、CDec 関数を使用して変換します。
[/MSDN]

で、たぶん、はにまるさんの「型」の認識はべつに間違っていないと思います。
単に、計算したときの誤差が出るか出ないかという話とはまったく関係ない事を
分かって頂ければ良いのではないでしょうか。

※通貨型8バイト、小数型12バイトって・・・メモリ使いすぎ
多用したくないですね・・・
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-13 11:47
引用:

ほむらさんの書き込み (2004-02-13 11:29) より:

正規化して0.1×10の-3乗になって
0.1が2進数では無理数だから。。。。



IEEE 浮動小数点表現
によれば、仮数部は1以上2未満だから、
0.0001 = 1.6384×(2^(-14))
かな?
これ以上は面倒くさいのでパス
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-13 11:51
引用:

ほむらさんの書き込み (2004-02-13 11:29) より:
ほむらです。
-------
ずっと疑問に思っていたのですけど
>double型の0.0001を1万回足したら何になるか質問して見てください。
って結局いくつになるのですか?



NAL-6295です。

いくつになるんでしょう。
一応、結果的には
.NETだと0.999999999999906まで表現
C++(Win32)だと0.99999999999990619まで表現
されるみたいですね。

1にならないという事が重要なので、あまり気にしたことはありませんでしたね。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-13 11:56
頭から湯気が出ています、はにまるです。
みなさま、フォローありがとうございます。

引用:

なちゃさんの書き込み (2004-02-13 11:29) より:
引用:

NAL-6295さんの書き込み (2004-02-13 11:13) より:
いや、固定少数点で正解ですよ。


はにまるさんの仰る浮動小数というのは、通常の2進数の浮動小数の、基数を10にしたようなもののことだと思いますよ。
内部表現でいうと、「仮数部10進数、指数部10のべき乗」みたいな感じのやつです。
これだと、当然有効桁数の考えはありますが、2進数で表現できない数値に対する誤差というものがなくなりますし、固定小数とは違い、ある程度の範囲の数値を表現できます。


フォローありがとうございます。
なちゃさんの仰る通りです。それで考えていました...

ただ、「浮動小数点表現」のIEEE規定では、基数部を「2」と定めているんですね、
ぢゃん♪さんから教えて頂いたHPを、先程見て確認しました...
# ここが抜けていた。

-----------------------------------------------------

こう言う事でしょうか?

「固定小数点表現」は2つ手段がある
 1.規定ビット以下の小数をマイナス2の累乗で計算する。
 2.内部は整数のみで利用時に10の累乗を計算して利用する。

「浮動小数点表現」は1つのみ
 3.IEEEが規定した基数部を「2」で考える手段

# 私は、ここの基数部を10で考えていました。
# それで、VBのCurrency が浮動小数点と勘違いした状態です。

 <特徴>
 1.速度:〇 誤差:出易い 表現範囲:△
 2.速度:△ 誤差:無し  表現範囲:×
 3.速度:× 誤差:出難い 表現範囲:◎

# 編集-追記
 bQの説明が途中から抜け落ちていました。

[ メッセージ編集済み 編集者: はにまる 編集日時 2004-02-13 12:37 ]

スキルアップ/キャリアアップ(JOB@IT)