【问题标题】:What is the significance of the value "6.37066138261923E-314" in VB?VB中值“6.37066138261923E-314”有什么意义?
【发布时间】:2019-09-27 08:17:14
【问题描述】:

我一直在我正在查看的 vb 代码中看到对特定值的引用,并想知道是否有人对它的重要性有任何线索。

var_ret_1 = Int((6.37066138261923E-314 / 32))

loc_0046BBAE: Var_Ret_2 = CDbl((6.37066138261923E-314 - 6.37066138261923E-314))
loc_0046BBC4: fcomp real8 ptr var_5C
loc_0046BBE3: Err.Raise
loc_0046BBE9:
loc_0046BBF5: If word ptr [ecx] < 0 Then GoTo loc_0046BBFD
loc_0046BBF7: Err.Raise
loc_0046BBFD:
loc_0046BC00: shl eax, 04h
loc_0046BC03: edi+edi*4 = edi+edi*4 - word ptr var_28
loc_0046BC0E: shl eax, 04h
loc_0046BC11: esi+esi*4 = esi+esi*4 - word ptr [ecx]
loc_0046BC38: Var_Ret_3 = CDbl((6.37066138261923E-314 - 6.37066138261923E-314))
loc_0046BC4E: fcomp real8 ptr var_68
loc_0046BC6F: edi = word ptr [eax] - 1```

【问题讨论】:

  • 我在您的 VB 示例代码中看到了神奇的数字。你指的是什么来源?示例出自哪里?
  • VBA 中的错误处理依赖于操作系统对异常的支持 (SEH)。它使用了一个奇怪的异常代码,0xC0000090(又名“浮点无效操作”)。很难猜出他们为什么喜欢那个,但它确实具有易于触发的优点。
  • @HansPassant 你怎么知道这些事情的:)
  • 非正规浮点操作数的数学运算,stackoverflow.com/a/14002547/17034
  • 你贴的源码不是普通的VB6。它是从已编译的 EXE 中反编译的。它是汇编语言(例如shl eacx, 04h)和VB6(例如CDbl)的混合体。它不会编译为 VB6,也不会编译为汇编程序。反编译器可能对源代码做了一些奇怪的事情。你说你在网上找到了代码,它到底在哪里?

标签: vb6


【解决方案1】:

这是在最小(最接近于零)的 64 位浮点数附近。也许当您将其从自身中减去时,它要么引发错误(指数溢出),要么将 Var_Ret_2 和 Var_Ret_3 归零,或者没有将这些变量完全归零。

这似乎是有问题的代码。

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2018-12-21
    • 2011-01-19
    • 2011-09-27
    • 2011-09-26
    • 2010-11-29
    • 2010-10-15
    • 2011-02-05
    • 2012-02-28
    相关资源
    最近更新 更多