【问题标题】:How do I declare MAX_DOUBLE in VB6?如何在 VB6 中声明 MAX_DOUBLE?
【发布时间】:2010-10-30 01:37:40
【问题描述】:

根据 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)?

【问题讨论】:

  • 如果 IDE 在您离开线路后立即显示该消息,您可能需要在选项中关闭自动语法检查。很多人觉得那些不停的消息框很烦人。 stackoverflow.com/questions/664370/…
  • 我不确定你会用这个做什么。测试变量是否大于 MAX_DOUBLE?哈哈
  • @Bob:很多用途,例如作为哨兵值。 en.wikipedia.org/wiki/Sentinel_value
  • 但这不是我们拥有 Null 的主要原因之一吗?是的,这意味着使用 Variant,但至少它使您免于魔数值落在有效值的自然范围内的危险。性能很重要,但不如避免内置陷阱重要。

标签: ide vb6 constants max minimum


【解决方案1】:

编辑: 解决了!

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

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

旧: 你可以使用Positive infinity

【讨论】:

  • 是的。我想我想要它只是为了完整性。就像 VB 的发明者只需要 IMP 和 EQV 以及 AND、OR、NOT 和 XOR。
  • 好的,我做了一些挖掘并更新了代码以包含正值和负值。在 const 中并不能完全理解,但它是进步。
【解决方案2】:

必须是 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

【讨论】:

  • +1 为了完整起见,您可能希望包含 CopyMemory 的声明。 Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) 显然,当我们想到发布 CopyMemory 时,我们必须始终记住要归功于 Bruce McKinney :) support.microsoft.com/kb/129947
【解决方案3】:

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

Const MAX_DOUBLE As Double = 1.79769313486231E+308

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

【讨论】:

  • 事实上,底层的值不是 ...6232,它被四舍五入到显示的值。它实际上是关于 ...6231557,因此您对 ...6231 的建议对于任何实际目的都足够接近。
【解决方案4】:

在数字中使用“E”代替“D”,如下所示。

Public Const MAX_DOUBLE = 1.79769313486232E+308

[编辑]

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

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

【讨论】:

  • 但是,如果您阅读 MSDN 文档(上面引用),E 表示法会解析为单值,而不是双值
  • 我也得到了 E 符号的溢出
  • 对不起,我更新了上面的帖子,再试一次,但没有“as Double”位。它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2016-06-27
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多