gpt4 book ai didi

vba - 从 VBA 中的 IEEE-754 double 中提取尾数、指数和符号数据

转载 作者:行者123 更新时间:2023-12-04 21:16:18 25 4
gpt4 key购买 nike

如何从 VBA 中的 IEEE-754 64 位(双)浮点数中提取尾数、指数和符号数据?谢谢

编辑 (在约翰科尔曼评论之后)。在发布原始问题之前,我已经四处寻找解决方案,但只能找到如何在 C 中执行此操作(例如,使用带有位字段的结构)。找不到任何适用于 VBA 的内容。我曾尝试使用 VBA 的位运算符(即 AND、OR、NOT、XOR),但这似乎并没有给出预期的结果。例如,以单精度 IEEE 32 位浮点数表示的 1 表示为

0 01111111 00000000000000000000000

其中第一位用于符号,接下来的 8 位用于(有偏的)指数,最后 23 位用于尾数。对 1 应用 NOT 应该返回

1 10000000 11111111111111111111111

十进制为-3.9999998,但VBA中的以下代码返回-2,表示为

1 10000000 00000000000000000000000

x = Not 1!
Debug.Print x

我没有看到在我的 OP 中发布此内容的意义。

最佳答案

我想我已经找到了做到这一点的方法。以下函数DoubleToBin返回代表 IEEE-754 双浮点数的 64 位字符串。它使用 VBA“技巧”通过组合 LSet 来传递原始数据,而不使用 API 例程(例如 MemCopy (RtlMoveMemory))。具有相同大小的用户定义类型。一旦我们有了位串,我们就可以从中提取所有组件。

Type TDouble
Value As Double
End Type

Type TArray
Value(1 To 8) As Byte
End Type

Function DoubleToArray(DPFloat As Double) As Variant
Dim A As TDouble
Dim B As TArray
A.Value = DPFloat
LSet B = A
DoubleToArray = B.Value
End Function

Function DoubleToBin(DPFloat As Double) As String
Dim ByteArray() As Byte
Dim BitString As String
Dim i As Integer
Dim j As Integer

ByteArray = DoubleToArray(DPFloat)

For i = 8 To 1 Step -1
j = 2 ^ 7
Do While j >= 1
If (ByteArray(i) And j) = 0 Then
BitString = BitString & "0"
Else
BitString = BitString & "1"
End If
j = j \ 2
Loop
Next i

DoubleToBin = BitString
End Function

它在这里如何工作 - 我现在接受我自己的答案吗?

关于vba - 从 VBA 中的 IEEE-754 double 中提取尾数、指数和符号数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31909506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com