回 帖 发 新 帖 刷新版面

主题:[讨论]紧急求助 关于浮点运算 在线等啊 求解决

我用VB写的一个关于单精度浮点的算法
已经4字节的16进制码 算出浮点数。

Function Float(a As Byte, b As Byte, c As Byte, d As Byte) As Double  [color=FF0000]'浮点计算[/color]
 Dim temp1 As String
 Dim y, temp2, temp3 As Double
 Dim i, e As Integer
If (a And &H80) = &H80 Then  [color=FF0000]取首位判断正负[/color]
 temp1 = "-"
Else: temp1 = ""
End If
e = ((a And &H7F) * &H2) + (b \ (&H2 ^ 7)) - 127    [color=FF0000]判断小数点位置[/color]
temp2 = (CLng((b Or &H80) * 65536) + c * 256 + d) \ (&H2 ^ (23 - e)) [color=FF0000]整数部分[/color] [color=FF00FF]有时候运行到这句直接跳出FUNCTION[/color]
y = (CLng((b Or &H80) * 65536) + c * 256 + d) Mod (&H2 ^ (23 - e))  [color=FF0000]小数部分16进制码[/color]
For i = 1 To (23 - e)
temp3 = temp3 + ((y Mod 2 ^ (23 - e + 1 - i)) \ 2 ^ (23 - e - i)) / 2 ^ i
Next i  [color=FF0000]小数部分数值计算[/color]
Float = temp1 & (temp2 + temp3)  [color=FF0000]合并[color=FF0000]
End Function

这是按照标准的浮点算法 用算术计算的代码 
计算上基本正确 现在的问题是  有的时候 当运行到temp2 这句的时候 就直接跳出去
为什么 我很想不明白?请大家想想办法给点建议。
这用是算术方法算的  比较笨 如果 有好的方法 请指点。 谢谢[em10][em10][em10][em10][em10][em10][em10][em10][em10]

回复列表 (共7个回复)

沙发

baidu  goole  gougou  sougou  yahoo 全部了 1个半小时  
发现了一个好的代码 
求解释 到底他是怎么计算的 
非本人同意严禁COPY
  Public Type mybyte
        my_byte(3)   As Byte
  End Type
    
  Public Type mysingle
        my_single   As Single
  End Type


Public Function b_s(g0 As Byte, g1 As Byte, g2 As Byte, g3 As Byte)
          Dim yourbyte     As mybyte
          Dim yoursingle     As mysingle
            
          yourbyte.my_byte(0) = g3
          yourbyte.my_byte(1) = g2
          yourbyte.my_byte(2) = g1
          yourbyte.my_byte(3) = g0
            
          LSet yoursingle = yourbyte
          b_s = yoursingle.my_single
  End Function

板凳

copymemory

3 楼

[quote]发现了一个好的代码 
求解释 到底他是怎么计算的 
非本人同意严禁COPY[/quote]
俺笑而不语.

如果你想实现设置Single某字节值,直接CopyMemory就是了
不过我看不出价值何在.
[code=c]
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pvDestination As Any, pvSource As Any, ByVal length As Long)

Private Function Float(ByVal b0 As Byte, ByVal b1 As Byte, ByVal b2 As Byte, ByVal b3 As Byte) As Single
    CopyMemory ByVal VarPtr(Float) + 3, b0, 1
    CopyMemory ByVal VarPtr(Float) + 2, b1, 1
    CopyMemory ByVal VarPtr(Float) + 1, b2, 1
    CopyMemory ByVal VarPtr(Float) + 0, b3, 1
End Function

Private Sub Form_Load()
    Dim s As Single
    s = Float(1, 2, 3, 4)
    Debug.Print s
End Sub
[/code]

4 楼

你提供的我看懂了 
麻烦帮我解释一下 我找到的那个。

5 楼

LSet yoursingle = yourbyte
==
CopyMemory(yoursingle, yourbyte, 4)
==
    CopyMemory ByVal VarPtr(yoursingle) + 3, yourbyte[0], 1
    CopyMemory ByVal VarPtr(yoursingle) + 2, yourbyte[1], 1
    CopyMemory ByVal VarPtr(yoursingle) + 1, yourbyte[2], 1
    CopyMemory ByVal VarPtr(yoursingle) + 0, yourbyte[3], 1

          yourbyte.my_byte(0) = g3
          yourbyte.my_byte(1) = g2
          yourbyte.my_byte(2) = g1
          yourbyte.my_byte(3) = g0
==
[code=c]
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pvDestination As Any, pvSource As Any, ByVal length As Long)

Private Function Float(ByVal b0 As Byte, ByVal b1 As Byte, ByVal b2 As Byte, ByVal b3 As Byte) As Single
    CopyMemory ByVal VarPtr(Float) + 3, b0, 1
    CopyMemory ByVal VarPtr(Float) + 2, b1, 1
    CopyMemory ByVal VarPtr(Float) + 1, b2, 1
    CopyMemory ByVal VarPtr(Float) + 0, b3, 1
End Function
[/code]

6 楼

楼上的大大   
最后再一个问题 
Private Sub Form_Load()
    Dim s As Single
    s = &H44444444
    Debug.Print s
End S
就这样 为什么不可以 
直接赋值 与COPYMEMORY 有什么区别? 

7 楼

[quote]直接赋值 与COPYMEMORY 有什么区别?[/quote]
个人觉得,直接赋值是采用的类型转换
而copyMemory相当于使用C语言中的共用体。将内存中一段内容既可以解释为float,又可以解释为Long。

我来回复

您尚未登录,请登录后再回复。点此登录或注册