VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2005/05/24(Tue) 01:29
投稿者Starfish
Eメール
URL
タイトルRe^4:

 わかりにくくてすみません。

> >  しかしながら、計算した結果が制度の悪い型になるというのは考えられません。
> 制度→精度、の事だと解釈しますが、この場合の「精度が悪い」というのは、
> どのような意味で書かれていますか?
> 「精度が悪い」という表現には、幾通りかの解釈があるかと思います。
>
> たとえば、「数値として表現可能な範囲が狭い」(最小値と最大値の差が小さい)とか、
> 「値と値の幅が広く、細かい値を表現できない」(整数型なら1単位、通貨型なら0.0001単位)とか。

 「値と値の幅が広く、細かい値を表現できない」こちらの意味です。通貨型は、8バイトですが
符号部が1ビットで残りの63ビットで0.0001単位の数値を表します。double型は、同じ8バイトですが
1ビットの符号部、11ビットの指数部、52ビットの仮数部ですので、通貨型の最大値に近い値を
double型に代入すると、63ビット-52ビットの11ビットの情報がなくなってしまいます。
10進数でいうと、通貨型は整数部が15桁で小数部が4桁ですが、double型の有効な桁数は15桁です。
従って、通貨型の最大値をdouble型に代入すると、ちょうど小数部分の情報が不正確な値になって
しまいます。

> >  『Debug.Print TypeName(10@ / 1@)』は、「Double」を返しますが、以下のコードを
> > 実行してみると、c3=c5 とはならず、c3には通貨型の精度で値が表示されます。
> 上記の、「通貨型の精度」という表現の意味がわかりませんでした。
>
> そらから、このコードが何を表しているのかも、良く分からなかったのですが、これは、

 通貨型/通貨型が何型の答えを返すかを調べようとしていました。(^^;

 簡単にすると、

Private Sub Command1_Click()
Dim a As Currency
Dim b As Double
    a = 922337203685465.5807@ / 1@
    Debug.Print a
    b = 922337203685465.5807@ / 1@
    a = b
    Debug.Print a
End Sub

 通貨型/通貨型が、倍精度浮動小数点数型で返るなら、aとbは同じ(微妙に違ってくる
可能性はあるかもしれませんが)結果になるはずです。しかしながら、結果は、
a: 922337203685465.5807
b: 922337203685465.625
となり、aは正しく表示されますが、bは小数以下の値が不正確なものとなっています。
 通貨型/通貨型の結果は、10進型で計算されていると思います。ただし、
割り算の結果をVariant型に入れると、倍精度浮動小数点数型を含むバリアント型に
なるみたいですが。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -