如何在VB6中声明MAX_DOUBLE?

4
根据VB6的MSDN帮助文档,浮点数可以表示为mmmEeee或mmmDeee的形式,其中mmm是尾数,eee是指数(10的幂)。Single数据类型的最大正值为3.402823E+38,即3.4乘以10的38次方;Double数据类型的最大正值为1.79769313486232D+308,约为10的308次方。在数字文字中使用D来分隔尾数和指数会使该值被视为Double数据类型。同样地,使用E以相同方式处理该值会将其视为Single数据类型。现在在VB6 IDE中,我已经尝试输入这个内容。
const MAX_DOUBLE as Double = 1.79769313486232D+308

然而,只要我离开那行代码,IDE就会抛出一个错误6(溢出)。

当您尝试执行超出分配目标限制的分配时,就会发生溢出。...

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


1
如果IDE在你离开该行时立即显示该消息,您可能希望在选项中关闭自动语法检查。许多人发现这些不断出现的消息框很烦人。 - MarkJ
我甚至不确定你会用这个做什么。测试变量是否大于MAX_DOUBLE?哈哈 - Bob
@Bob:有很多用途,例如作为哨兵值。http://en.wikipedia.org/wiki/Sentinel_value - MarkJ
但这不是我们拥有 Null 的主要原因之一吗?是的,它暗示了使用 Variant,但至少它可以避免落在有效值自然范围内的魔数值的危险。性能很重要,但避免工程上的陷阱同样重要。 - Bob
4个回答

6

编辑:问题已解决!

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

我已经仔细检查到二进制层面,这应该是最高的级别了。你可以继续添加值如1等,但它只会得到一个等于而不是大于DoubleMax的数字。 输出结果如下: 01111111|11101111|11111111|11111111|11111111|11111111|11111111|11111111 这确实是DoubleMax。

旧版: 你可以使用正无穷


真的。我想我只是为了完整性而想要它。就像 VB 的发明者一样,他们除了 AND、OR、NOT 和 XOR 之外,也必须拥有 IMP 和 EQV。 - bugmagnet
好的,我进行了一些调查,并更新了代码以包括正值和负值。虽然还没有完全达到常量的程度,但已经有所进展了。 - Oorang
我刚刚确认了这个结果与乌鸦的答案使用CopyMemory相同(每个结果在本地窗口中显示相同,“theOne = theOther”解析为“True”)。 - Mark E.

4

是否必须是常量? 你可以通过从字节数组中设置正确的位模式来将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,以便完整。私有声明子过程CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)。显然,我们必须始终记得在发布CopyMemory时归功于Bruce McKinney :) http://support.microsoft.com/kb/129947 - MarkJ
很酷的是看到一个Double逐字节地构建。不过我想知道它是否将字节数组称为Bits(0到7)。它让人觉得你正在构建一个由8位组成的单个字节,但实际上你正在填充一个由8个字节组成的数组,对吗? - Mark E.

0
明显的实用解决方法:稍微减少数量。
Const MAX_DOUBLE As Double = 1.79769313486231E+308

我想在大多数情况下这应该是足够的。


事实上,底层值并不是...6232,这只是为了显示而四舍五入的结果。它实际上是关于...6231557左右的,所以你提出的...6231对于任何实际目的来说都足够接近。 - Jim Mack

-2

但是,如果你阅读MSDN文档(如上所引),E符号会被解析为单精度值而非双精度值。 - bugmagnet
1
我在使用E表示法时也遇到了溢出问题。 - bugmagnet
抱歉,我已经更新了上面的帖子,请再次尝试,但请勿使用“as Double”这一部分。应该可以正常工作。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接