|
こんばんは。
標準モジュールに
'===================================================
Option Explicit
Type d_data
dbl As Double
End Type
Type s_data
sng As Single
End Type
Type bd_data
byt(0 To 7) As Byte
End Type
Type bs_data
byt(0 To 3) As Byte
End Type
Function floating_img(ByVal myvalue As Variant, ByVal typ As Long) As String
'指定された型の数値のメモリーイメージをHEXコードで出力する
'in ----myvalue----数値
' typ=0--single 1--double
'out-----floating_img ---メモリーイメージ(HEXコードで)
On Error Resume Next
Const typ_sin = 0
Const typ_dbl = 1
Dim g0 As Long
Dim g1 As Long
Dim dd As d_data
Dim ss As s_data
Dim bb_s As bs_data
Dim bb_d As bd_data
Dim wk As String
Select Case typ
Case typ_sin
ss.sng = CSng(myvalue)
LSet bb_s = ss
Case typ_dbl
dd.dbl = CDbl(myvalue)
LSet bb_d = dd
End Select
If typ = 0 Then
g1 = UBound(bb_s.byt())
Else
g1 = UBound(bb_d.byt())
End If
floating_img = ""
For g0 = g1 To 0 Step -1
If typ = 0 Then
wk = Hex(bb_s.byt(g0))
Else
wk = Hex(bb_d.byt(g0))
End If
If Len(wk) = 1 Then wk = "0" & wk
floating_img = floating_img & wk
Next
End Function
(以前は、一度ファイルに落としていたんですが、
Lsetで出来ることをとあるサイトで教えていただきました)
として、
内部形式まで調べてみます。
問題のセルA21に対して
適当なセルに
=floating_img(A21,1)
と
=floating_img(3,1)
との結果の違いを確認してください。
セルA21は、
4008000000000004
数値の3の場合は、
4008000000000000
かなり深い桁で値が違ってますよね?
ご推察どおり、小数の誤差です。
この結果の違いが影響しています。
Singleに変換すると、値が切られているので(Singleは4バイト)
この場合は、等しくなります。
数式内で比較すると、何らかの補正がされているみたいですが!!
Function test(x) As Variant
If Evaluate("and(" & x & ">=1," & x & "<=3)") Then
test = "ok"
Else
test = "ng"
End If
End Function
=test(a21)
適当なセルで上記の関数を試してみてください
|
|