目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
73 / 118 ツリー ←次へ | 前へ→

【150】浮動小数点型の内部形式 ichinose 06/7/31(月) 13:43 Excel[未読]
【151】Re:浮動小数点型の内部形式 ichinose 06/7/31(月) 14:06 Excel[未読]

【150】浮動小数点型の内部形式
Excel  ichinose  - 06/7/31(月) 13:43 -

引用なし
パスワード
   任意の数値の単精度浮動小数点型(Single)や倍精度浮動小数点型(Double)の
内部形式のビットイメージを知りたい。

sub Test()
  dim ss as single
  dim dd as double
  ss=7
  dd=7
'このときのssとddの内部データ形式が知りたいのですが・・・
end sub


 

【151】Re:浮動小数点型の内部形式
Excel  ichinose  - 06/7/31(月) 14:06 -

引用なし
パスワード
   新規ブックの標準モジュールに

'=====================================================================
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

で上記のビットイメージが正しいことがわかります。

実際には、倍精度も同じように出力されます。

色々な数字で試してみてください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
73 / 118 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free