4

根据 VB6 的 MSDN 帮助

浮点值可以表示为 mmmEeee 或 mmmDeee,其中 mmm 是尾数,eee 是指数(10 的幂)。Single 数据类型的最大正值为 3.402823E+38,即 3.4 乘以 10 的 38 次方;Double 数据类型的最大正值为 1.79769313486232D+308,即 1.8 乘以 10 的 308 次方。使用 D 分隔数字文字中的尾数和指数会导致该值被视为 Double 数据类型。同样,以相同方式使用 E 会将值视为 Single 数据类型。

现在在 VB6 IDE 中我尝试输入这个

const MAX_DOUBLE as Double = 1.79769313486232D+308

但是,一旦我离开那条线,IDE 就会抛出错误 6(溢出)

当您尝试进行超出分配目标限制的分配时,会导致溢出。...

那么如何定义 MAX_DOUBLE (以及 MIN_DOUBLE )?

4

4 回答 4

5

编辑:解决了!

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

仔细检查到二进制级别,应该尽可能高。您可以继续添加 1 等值,但它会产生一个等于而不是大于的数字。输出是这样的: 01111111|11101111|11111111|11111111|11111111|11111111|11111111|11111111 这确实是 DoubleMax

旧:您可以只使用Positive infinity

于 2009-06-01T03:46:52.760 回答
4

它必须是一个常量吗?您可以通过使用 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
于 2009-05-30T19:49:03.237 回答
0

明显实用的解决方法:稍微减少数量。

Const MAX_DOUBLE As Double = 1.79769313486231E+308

我想这在大多数情况下就足够了。

于 2009-05-30T06:56:43.967 回答
-1

使用“E”作为数字中的指数,而不是像下面这样的“D”。

Public Const MAX_DOUBLE = 1.79769313486232E+308

[编辑]

看看下面的这个链接,滚动到底部。这个具体的代码示例展示了如何使用这个结构。希望这会有所帮助。

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

于 2009-05-30T05:30:06.417 回答