2009-05-30 14 views
2

Gemäß der MSDN Hilfe für VB6Wie deklariere ich MAX_DOUBLE in VB6?

Gleitkommawerte können als mmmEeee mmmDeee oder ausgedrückt werden, bei dem die Mantisse mmm und EEE ist der Exponent (eine Leistung von 10). Der höchste positive Wert eines Datentyps Single ist 3,402823E + 38 oder 3,4 Mal 10 bis 38. Potenz; Der höchste positive Wert eines Double-Datentyps ist 1.79769313486232D + 308 oder etwa 1,8 mal 10 zur 308ten Potenz. Wenn Sie D verwenden, um die Mantisse und den Exponenten in einem numerischen Literal zu trennen, wird der Wert als Double-Datentyp behandelt. Gleichermaßen behandelt die Verwendung von E auf dieselbe Weise den Wert als einen einzelnen Datentyp.

Jetzt in der VB6 IDE habe ich versucht, diese

const MAX_DOUBLE as Double = 1.79769313486232D+308 

jedoch eingeben, sobald ich weg von dieser Linie das IDE einen Fehler 6 (Überlauf) führt

Wenn Sie versuchen, eine Zuweisung zu erstellen, die die Einschränkungen des Ziels der Zuweisung überschreitet, tritt ein Überlauf auf. ...

Also wie bekomme ich MAX_DOUBLE (und MIN_DOUBLE für diese Angelegenheit) definiert?

+1

Wenn die IDE Ihnen diese Nachricht anzeigt, sobald Sie sich von der Linie entfernen, sollten Sie die automatische Syntaxprüfung in den Optionen ausschalten. Viele Leute finden diese unaufhörlichen Nachrichtenfelder irritierend. http://stackoverflow.com/questions/664370/your-favorite-visual-basic-6-tools-and-tips/667225#667225 – MarkJ

+0

Ich bin mir nicht sicher, wofür Sie das überhaupt verwenden würden. Testen Sie, ob eine Variable größer als MAX_DOUBLE ist? LOL – Bob

+0

@Bob: viele Anwendungen, zum Beispiel als Sentinel-Wert. http://en.wikipedia.org/wiki/Sentinel_value – MarkJ

Antwort

4

Muss es ein Const sein? Sie können den genauen Wert von MAX_DOUBLE in eine Variable abrufen, indem Sie das richtige Bitmuster mit CopyMemory aus einem Byte-Array festlegen.

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 

Edit: Ich habe vergessen, dass Sie auch nach MIN_DOUBLE gefragt, die noch einfacher ist.

Dim Min As Double 
Dim Bits As Byte 

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

Debug.Print Min 
+3

+1 Sie möchten die Deklaration für CopyMemory nur der Vollständigkeit halber einschließen. Private Declare Sub CopyMemory Lib "KERNEL32" Alias ​​"RtlMoveMemory" (hpvDest als Any, hpvSource als Any, ByVal cbCopy als Long) Natürlich müssen wir immer daran denken, Bruce McKinney immer dann zuzuschreiben, wenn wir CopyMemory :) http: // support. microsoft.com/kb/129947 – MarkJ

-1

Verwenden Sie ein "E" für den Exponenten in der Zahl anstelle eines "D" wie unten.

Public Const MAX_DOUBLE = 1.79769313486232E+308 

[Bearbeiten]

Werfen Sie einen Blick auf diesen Link unten, scrollen Sie nach unten. Dieses konkrete Codebeispiel zeigt, wie dieses Konstrukt verwendet wird. Hoffentlich hilft das.

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

+0

Aber wenn Sie die MSDN-Dokumentation (zitiert oben) lesen, löst die E-Notation zu einem einzelnen Wert, nicht zu einem doppelten – bugmagnet

+0

Und ich bekomme einen Überlauf mit der E-Notation sowie – bugmagnet

+0

Sorry, ich aktualisierte den Beitrag oben, versuchen Sie es erneut, aber ohne das "as Double" -Bit. Es sollte funktionieren. – James

0

Offensichtliche pragmatische Lösung: die Zahl leicht reduzieren.

Const MAX_DOUBLE As Double = 1.79769313486231E+308 

Ich stelle mir vor, dass in den meisten Situationen ausreichend sein wird.

+0

In der Tat ist der zugrunde liegende Wert nicht ... 6232, es ist für die Anzeige gerundet. Es geht eigentlich um ... 6231557, also ist Ihr Vorschlag von ... 6231 für jeden praktischen Zweck nahe genug. –

3

Edit: es gelöst!

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

doppelt geprüft es auf die binäre Ebene nach unten, die so hoch sein sollte, wie Sie gehen können. Sie können weiterhin Werte wie 1 usw. hinzufügen, aber es ergibt sich eine Zahl gleich, nicht größer als. Ausgabe ist dies: 01111111 | 11101111 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111 die in der Tat DoubleMax ist

Alt: Sie nur Positive infinity nutzen könnten.

+0

Wahr. Ich nehme an, ich wollte es nur der Vollständigkeit halber. Genauso wie die Erfinder von VB nur IMP und EQV sowie AND, OR, NOT und XOR haben mussten. – bugmagnet

+0

OK, ich habe etwas gegraben und den Code aktualisiert, um positive und negative Werte einzubeziehen. Ich verstehe es nicht ganz in einem const, aber es ist ein Fortschritt. – Oorang

+1

Got yer const arbeiten :) – Oorang