投稿日 | : 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型に入れると、倍精度浮動小数点数型を含むバリアント型に
なるみたいですが。