2009-05-30 9 views
2

VB6どのようにしてVB_DATEでMAX_DOUBLEを宣言しますか?

ためのMSDNヘルプによれば

浮動小数点値は仮数及びEEEは指数(10のパワー)であるれたMMMに、mmmEeee又はmmmDeeeとして表すことができます。 Singleデータ型の最高正の値は、3.402823E + 38、または38乗の10倍の3.4倍です。 Doubleデータ型の正の最大値は1.79769313486232D + 308、つまり308乗の約1.8倍です。 Dを使用して数値リテラルの仮数と指数を区切ると、その値はDoubleデータ型として扱われます。同様に、Eを同じ方法で使用すると、その値がSingleデータ型として扱われます。私はこの

const MAX_DOUBLE as Double = 1.79769313486232D+308 

を入力しようとしたVB6 IDEで今

しかし、できるだけ早く私は離れて、その行から移動すると、IDEがエラー6(オーバーフロー)

をスローします

割り当ての対象の制限を超える割り当てをしようとすると、オーバーフローが発生します。 ...

MAX_DOUBLE(とMIN_DOUBLEはどのように定義されていますか)をどのように定義できますか?

+1

IDEから回線を離れるとすぐにそのメッセージが表示される場合は、オプションの自動構文チェックをオフにしたい場合があります。多くの人々は、これらの絶え間ないメッセージボックスが刺激的であることを発見します。 http://stackoverflow.com/questions/664370/your-favorite-visual-basic-6-tools-and-tips/667225#667225 – MarkJ

+0

私はあなたがこれをどう使うべきか分かりません。変数がMAX_DOUBLEより大きいかどうかをテストしますか? LOL – Bob

+0

@Bob:例えばセンチネル値など、多くの用途があります。 http://en.wikipedia.org/wiki/Sentinel_value – MarkJ

答えて

4

Constにする必要はありますか? Byte配列のCopyMemoryを使用して正しいビットパターンを設定することにより、MAX_DOUBLEの正確な値を変数に取り入れることができます。

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 

Dim Max As Double 
Dim Idx As Long 
Dim Bits(0 To 7) As Byte 

For Idx = 0 To 5 
    Bits(Idx) = 255 
Next 
Bits(6) = 239 ' = 11101111 
Bits(7) = 127 

For Idx = 0 To 7 
    CopyMemory ByVal VarPtr(Max) + Idx, Bits(Idx), 1 
Next 

Debug.Print Max 

編集:MIN_DOUBLEについても尋ねたことを忘れてしまった。これはさらに簡単です。

Dim Min As Double 
Dim Bits As Byte 

Bits = 1 
CopyMemory ByVal VarPtr(Min), Bits, 1 

Debug.Print Min 
+3

+1完全性のためにCopyMemoryの宣言を含めることができます。 Private Declare Sub CopyMemory Lib "KERNEL32"エイリアス "RtlMoveMemory"(hpvDest As Any、hpvSource As Any、ByVal cbCopy As Long)明らかに、私たちはCopyMemory:http://のサポートを投稿すると考えていても、常にBruce McKinneyのクレジットを覚えておく必要があります。 microsoft.com/kb/129947 – MarkJ

-1

数値の指数部に "D"の代わりに "E"を使用します。

Public Const MAX_DOUBLE = 1.79769313486232E+308 

[編集]

は、以下のリンクを見てみましょう、一番下までスクロールします。この具体的なコード例は、この構成がどのように採用されているかを示しています。うまくいけば、これは役に立ちます。

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22555684.html

+0

MSDNのドキュメント(上に引用)を読むと、E表記法はDouble値ではなく単一値に解決されます – bugmagnet

+0

そしてE記法でもオーバーフローします – bugmagnet

+0

申し訳ありませんが、 "as double"ビットは使用しないでください。それは動作するはずです。 – James

0

明白な実用的な回避策:わずか数を減らします。

Const MAX_DOUBLE As Double = 1.79769313486231E+308 

ほとんどの状況で適切と思われます。

+0

実際、基になる値は... 6232ではありません。表示するために丸められます。それは実際には... 6231557なので、あなたの提案は... 6231は実用的な目的のために十分に近いです。 –

3

編集: はそれを解決します!

Const test As Double = 1.79769313486231E+308 + 5.88768018655736E+293 

ダブルあなたが行くことができる限り高くすべきであるバイナリレベルにそれをチェックします。あなたは1などの値を追加し続けることができますが、それは以下の値に等しいかそれよりも大きくはありません。 あなただけ使用することができPositive infinity:| 11101111 | 11111111 | 11111111 | 11111111 | 11111111 | | 11111111確かDoubleMax

古いです11111111 01111111: 出力がこれです。

+0

True。私は完全性のためだけにそれを望んでいたと思う。同様に、VBの発明者は、AND、OR、NOT、XORだけでなく、IMPとEQVを持っていなければなりません。 – bugmagnet

+0

OK、掘り下げて、正と負の値を含むようにコードを更新しました。あなたはconstでそれを得ていませんが、それは進歩です。 – Oorang

+1

yer const working :) – Oorang

関連する問題