Эта страница показывает немного мучительный способ сделать это. Я сократил его, чтобы соответствовать тому, о чем просил ваш вопрос, но не проверил полностью. Дайте мне знать, если есть какие-либо проблемы. Одна вещь, которую я заметил на этом сайте, состоит в том, что код, который они имели для тихого NaN, был неправильным, он должен начинать мантиссу с 1-битного - их, похоже, перепутали с сигнальным NaN.
Public NegInfinity As Double
Public PosInfinity As Double
Public QuietNAN As Double
Private Declare Sub CopyMemoryWrite Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Destination As Long, source As Any, ByVal Length As Long)
' IEEE754 doubles: '
' seeeeeee eeeemmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm '
' s = sign '
' e = exponent '
' m = mantissa '
' Quiet NaN: s = x, e = all 1s, m = 1xxx... '
' +Inf : s = 0, e = all 1s, m = all 0s. '
' -Inf : s = 1, e = all 1s, m = all 0s. '
Public Sub Init()
Dim ptrToDouble As Long
Dim byteArray(7) As Byte
Dim i As Integer
byteArray(7) = &H7F
For i = 0 To 6
byteArray(i) = &HFF
Next
ptrToDouble = VarPtr(QuietNAN)
CopyMemoryWrite ptrToDouble, byteArray(0), 8
byteArray(7) = &H7F
byteArray(6) = &HF0
For i = 0 To 5
byteArray(i) = 0
Next
ptrToDouble = VarPtr(PosInfinity)
CopyMemoryWrite ptrToDouble, byteArray(0), 8
byteArray(7) = &HFF
byteArray(6) = &HF0
For i = 0 To 5
byteArray(i) = 0
Next
ptrToDouble = VarPtr(NegInfinity)
CopyMemoryWrite ptrToDouble, byteArray(0), 8
End Sub
Он в основном использует копии памяти уровня ядра для передачи битовых комбинаций из байтового массива в двойной.
Следует помнить, однако, что есть несколько битовых значений, которые могут представлять QNaN, в частности, бит знака может быть 0 или 1, и все биты мантиссы, кроме первого, также могут быть равны нулю. или 1. Это может усложнить вашу стратегию для сравнений, если вы не сможете обнаружить, использует ли VB6 только один из битовых шаблонов - однако это не повлияет на инициализацию этих значений, если допустить, что VB6 правильно реализует двойные значения IEE754.