// 原理:除2取模是最低位
func DecToBin(n int) string {
result := ""
if n == 0 {
return "0"
}
for ; n > 0; n /= 2 {
lsb := n % 2
result = strconv.Itoa(lsb) + result
}
return result
}
func Str2DEC(s string) (num int) {
l := len(s)
for i := l - 1; i >= 0; i-- {
num += (int(s[l-i-1]) & 0xf) << uint8(i)
}
return
}
//IEEE754 16进制浮点型 转为十进制 代码
func IEEE75416ToDec(val string) (float64, error) {
var data1 []byte = []byte(val)
if len(data1) != 8 {
return 0, errors.New("传入的IEEE754标准的值位数不够")
}
//16进制转成10进制
n, err := strconv.ParseInt("0x"+val, 0, 32)
if err != nil {
return 0, err
}
//10进制转化为2进制
string1 := DecToBin(int(n))
//补充长度到32位
if len(string1) < 32 {
addString := ""
for i := len(string1); i < 32; i++ {
addString = "0" + addString
}
string1 = addString + string1
}
//转为字符数组
var data []byte = []byte(string1)
//幂数的计算字符串
var value2String string = ""
for i := 1; i <= 8; i++ {
value2String = value2String + string(data[i])
}
//二进制字符串转成十进制
fmt.Printf("%v", Str2DEC(value2String))
value2 := Str2DEC(value2String)
var value3 float64 = 0.0
//求幂
for i := 9; i <= 31; i++ {
tmpValue, _ := strconv.ParseInt(string(data[i]), 0, 16)
tmpValueFloat := float64(tmpValue)
f2 := math.Pow(2, float64((i-8)*-1)) * tmpValueFloat
value3 = f2 + value3
}
value1, _ := strconv.ParseInt(string(data[0]), 0, 16)
result := math.Pow(-1, float64(value1)) * (1 + value3) * math.Pow(2, float64(value2-127))
return result, nil
}