|
新規ブックの標準モジュールに
'=====================================================================
Sub main()
Dim cnvnum As Variant
Dim csinstr As String
Dim cdblstr As String
cnvnum = Application.InputBox("数字を入力してください", "単精度・倍精度浮動小数点構造", , , , , , 1)
If cnvnum <> "Boolean" Then
With ActiveSheet
With .Range("a:a")
.ColumnWidth = 40
.HorizontalAlignment = xlCenter
End With
With .Range("b:b")
.ColumnWidth = 10
.HorizontalAlignment = xlCenter
End With
With .Range("c:c")
.ColumnWidth = 40
.HorizontalAlignment = xlCenter
End With
With .Range("d:d")
.ColumnWidth = 100
.HorizontalAlignment = xlLeft
End With
With .Range("a1:e1")
.HorizontalAlignment = xlLeft
.MergeCells = True
.Value = "単精度浮動小数点型"
.Font.Size = 14
.HorizontalAlignment = xlLeft
.Interior.ColorIndex = 34
End With
.Range("a2:e2").Value = Array("説明", "符号", "指数部", "仮数部", "ヘキサイメージ")
.Range("d2").HorizontalAlignment = xlCenter
.Range("e2").HorizontalAlignment = xlCenter
csinstr = floating_point(cnvnum, 0)
.Range("a3").Value = "'値---- " & cnvnum
.Range("b3").Value = "'" & Mid(hextobin(Mid(csinstr, 1, 1)), 1, 1)
.Range("c3").Value = "'" & Mid(hextobin(Mid(csinstr, 1, 1)), 2, 3) & " " & hextobin(Mid(csinstr, 2, 1)) & _
" " & Mid(hextobin(Mid(csinstr, 3, 1)), 1, 1)
.Range("d3").Value = "'" & Mid(hextobin(Mid(csinstr, 3, 1)), 2, 3)
For idx = 4 To 8
.Range("d3").Value = .Range("d3").Value & " " & hextobin(Mid(csinstr, idx, 1))
Next
With .Range("e3")
.Value = "'" & csinstr
.HorizontalAlignment = xlLeft
End With
.Range("a4:e4").Value = Array("BIT構成", "'1", "'8", "' 23", "'32")
.Range("e4").HorizontalAlignment = xlCenter
With .Range("a5:e5")
.MergeCells = True
.Value = "倍精度浮動小数点型"
.Font.Size = 14
.HorizontalAlignment = xlLeft
.Interior.ColorIndex = 34
End With
.Range("a6:d6").Value = Array("説明", "符号", "指数部", "仮数部", "ヘキサイメージ")
.Range("d6").HorizontalAlignment = xlCenter
.Range("e6").HorizontalAlignment = xlCenter
csinstr = floating_point(cnvnum, 1)
.Range("a7").Value = "'値---- " & cnvnum
.Range("b7").Value = "'" & Mid(hextobin(Mid(csinstr, 1, 1)), 1, 1)
.Range("c7").Value = "'" & Mid(hextobin(Mid(csinstr, 1, 1)), 2, 3) & " " & hextobin(Mid(csinstr, 2, 1)) & _
" " & hextobin(Mid(csinstr, 3, 1))
.Range("d7").Value = "'" & hextobin(Mid(csinstr, 4, 1))
For idx = 5 To 16
.Range("d7").Value = .Range("d7").Value & " " & hextobin(Mid(csinstr, idx, 1))
Next
With .Range("e7")
.Value = "'" & csinstr
.HorizontalAlignment = xlLeft
End With
.Range("a8:e8").Value = Array("BIT構成", "'1", "'11", "' 52", "'64")
.Range("e8").HorizontalAlignment = xlCenter
.Range("a:e").EntireColumn.AutoFit
End With
End If
End Sub
'=====================================================================
Function hextobin(hexstr As String) As String
'指定されたハーフバイト分(一桁)の16進数を2進数に変換する
'in----hexstr----16進数(0〜F)
'out---hextobin--変換されたBITイメージ(2進数)ハーフバイト分
Dim idx As Long
Dim wk As Integer
wk = Int("&h" & hexstr)
For idx = 3 To 0 Step -1
If 2 ^ idx And wk Then
hextobin = hextobin & "1"
Else
hextobin = hextobin & "0"
End If
Next
End Function
'=====================================================================
Function floating_point(ByVal myvalue As Variant, ByVal typ As Long) As String
'指定された型の数値のメモリーイメージをHEXコードで出力する
'in ----myvalue----数値
' typ=0--single 1--double 2----currency
'out-----floating_Point ---メモリーイメージ(HEXコードで)
On Error Resume Next
Const typ_sin = 0
Const typ_dbl = 1
Const typ_cur = 2
Const flnm = "\binary.tmp"
Dim dbb(0 To 7) As Byte
Dim sbb(0 To 3) As Byte
Dim idx As Long
Dim mes As String
Dim dd As Double
Dim ss As Single
Dim cc As Currency
Dim fnum As Long
Dim wk As String
Select Case typ
Case typ_sin
ss = CSng(myvalue)
Case typ_dbl
dd = CDbl(myvalue)
Case typ_cur
cc = CCur(myvalue)
End Select
Kill ThisWorkbook.Path & flnm
On Error GoTo 0
fnum = FreeFile()
Open ThisWorkbook.Path & flnm For Random As #fnum Len = IIf(typ = typ_sin, UBound(sbb()) + 1, UBound(dbb()) + 1)
Select Case typ
Case typ_sin
Put #fnum, , ss
Get #fnum, 1, sbb()
Case typ_dbl
Put #fnum, , dd
Get #fnum, 1, dbb()
Case typ_cur
Put #fnum, , cc
Get #fnum, 1, dbb()
End Select
Close #fnum
Kill ThisWorkbook.Path & flnm
floating_point = ""
For idx = IIf(typ = typ_sin, UBound(sbb()), UBound(dbb())) To 0 Step -1
If typ = typ_sin Then
wk = Hex(sbb(idx))
If Len(wk) = 1 Then wk = "0" & wk
floating_point = floating_point & wk
Else
wk = Hex(dbb(idx))
If Len(wk) = 1 Then wk = "0" & wk
floating_point = floating_point & wk
End If
Next
Erase sbb(), dbb()
End Function
**マクロは一度、必ず保存してから使用してください
何も書かれていないシートをアクティブにしてmainを実行します。
1.数字の入力要求がありますから、
内部形式が知りたい任意の数字を指定してください。
入力したら、「OK」をクリックしてください。
2.アクティブシートに対して以下のレイアウトで
単精度及び、倍精度のビットイメージを作成します。
数字として、7を指定した場合。
単精度浮動小数点型
説明 符号 指数部 仮数部 ヘキサイメージ
値-7 0 100 0000 1 110 0000 0000 0000 0000 0000 40E00000
構成 1 8 23 32
倍精度浮動小数点型
・
・(横に長いから省略)
・
符号、指数部、仮数部の詳細は、「浮動小数点」で調べていただくとして
7の場合、
符号-------0----正数
指数部---10000001(二)------>129
バイアス定数が127なので129-127=2 2^2
仮数部
110・・・・
1/2+1/4=0.75------>1が省略されているので仮数部は1.75
よって、1.75*2^2=7
で上記のビットイメージが正しいことがわかります。
実際には、倍精度も同じように出力されます。
色々な数字で試してみてください。
|
|