主题:如何显示单精度数?
greatmenddc
[专家分:0] 发布于 2008-09-12 14:54:00
[color=FF00FF][size=4]我在显示单精度数的时候遇到了一点问题,即一个单精度数,比如:42798000,它表示十进制的62.375,我希望在文本框中显示出来"62.375".可是我将42798000拆成42,79,80,00四个字节输入一个单精度型变量后,在文本框中显示出来的却是"4.2798E+07".我用几种类型转换函数尝试也没能凑效,希望能得到高手相助.[/size][/color]
回复列表 (共7个回复)
沙发
snyga [专家分:1480] 发布于 2008-09-13 11:44:00
Dim k As Single
k = 42798000
Debug.Print k
Debug.Print Format(k, "0")
板凳
我是大喊三 [专家分:3010] 发布于 2008-09-13 19:15:00
什么意思?:42798000是机内存储的方式?是十六进制吗?
3 楼
moz [专家分:37620] 发布于 2008-09-14 08:52:00
如果作为字符串使用,
可以在数字前加 ' 号.
但我好像无论是怎样计算,
这四个字节都无法得到62.375这个结果啊.
4 楼
greatmenddc [专家分:0] 发布于 2008-09-14 12:27:00
最近我仔细研究了单精度数的格式,这里我解释一下62.375的来由:42798000是十六进制表示,变成二进制是:
01000010 01111001 10000000 00000000
4 2 7 9 8 0 0 0 这四个字节在单精度数中顺序是颠倒的,
即: 0 0 8 0 7 9 4 2
00000000 10000000 01111001 01000010
MMMMMMMM MMMMMMMM EMMMMMMM SEEEEEEE
1 2 3 4
1.S表示符号,1表示负,0表示正 这里是:正
2.第4字节的七个E加上第3字节的一个E表示2的方次,这里是:10000100(2) 或132(10进制)
3.第3字节剩余的七位加上第2第1字节共23位构成尾数,这里是:1111001 1000000 00000000
4.单精度数的整数部分永远是1故而省略,还原时要补上即:1.MMMMMMMMMMMMMMMMMMMMMMM
这里是: 1.11110011000000000000000
单精度数的二进表示规定为:
(-1)^S*1.MMMMMMMMMMMMMMMMMMMMMMM*2^(E-127)
因为S=0, E-127=132-127=5.(二进制数乘一次2就是左移一位,这里左移5位)
所以上面的二进制数就变成: 111110.011 (后面的0没有意义全部省略)
111110换成十进制=62
0.01 =0.25
0.001 =0.125
相加后 =62.375
我搞单片机有些时候了,VB则刚接触一个多月.从一个单片机系统产生的单精度数输入到PC机(32位2进制从串口输入)在单片机中将单精度数转换成BCD码显示出来我很清楚.但在VB中应该怎么做我一无所知.
5 楼
我是大喊三 [专家分:3010] 发布于 2008-09-14 15:36:00
高级语言不用这么做的吧,关键是你说的储存格式是否和VB的一致,或者查看一下VB对单精度浮点数的机内表示方式。
6 楼
moz [专家分:37620] 发布于 2008-09-14 18:39:00
msgbox(ToS("42798000"))
Function ToS(T0)
Ta=To2(Val("&H" & Mid(T0,1,2)))+To2(Val("&H" & Mid(T0,3,2)))+To2(Val("&H" & Mid(T0,5,2)))+To2(Val("&H" & Mid(T0,7,2)))
If Left(Ta, 1) = "0" Then Tf = 1 Else Tf = -1
Tz = Val(To10(Mid(Ta, 2, 8))) - 127
ToS = Tf * To10("1" & Mid(Ta, 10, Tz)) + Tox(Mid(Ta, 10 + Tz))
End Function
Function To2(T10)
Do While T10 > 0
To1 = Mid("01", 1 + T10 Mod 2, 1) + To1
T10 = T10 \ 2
Loop
To2 = Right(String(8, "0") + To1, 8)
End Function
Function To10(T2)
T0 = 1
Tl = Len(T2)
For i = 1 To Tl
T1 = T1 + T0 * Val(Mid(T2, Tl - i + 1, 1))
T0 = T0 * 2
Next
To10 = T1
End Function
Function Tox(T2)
T0 = 1 / 2
For i = 1 To Len(T2)
T1 = T1 + T0 * Val(Mid(T2, i, 1))
T0 = T0 / 2
Next
Tox = T1
End Function
7 楼
老大徒伤悲 [专家分:29120] 发布于 2008-09-15 17:37:00
同意喊山的意见。
我来回复