IEEE754介紹
?
IEEE 754是一種標(biāo)準(zhǔn),用于表示和執(zhí)行浮點(diǎn)數(shù)運(yùn)算的方法。在這個(gè)標(biāo)準(zhǔn)中,單精度浮點(diǎn)數(shù)使用32位二進(jìn)制表示,分為三個(gè)部分:符號(hào)位、指數(shù)位和尾數(shù)位。
符號(hào)位(s)
用一個(gè)位來(lái)表示數(shù)的正負(fù),0表示正數(shù),1表示負(fù)數(shù)。
指數(shù)位(e)
用8位表示指數(shù)。對(duì)于單精度浮點(diǎn)數(shù),指數(shù)位是以偏移量的形式表示的。也就是說(shuō),實(shí)際的指數(shù)值是指數(shù)位的無(wú)符號(hào)值減去一個(gè)偏移量(127)。
尾數(shù)位(m)
用23位表示數(shù)的尾數(shù)部分。尾數(shù)是一個(gè)二進(jìn)制小數(shù),被規(guī)范化為一個(gè)小于1的數(shù)。
表達(dá)式:
V = ( ? 1 ) s × ( 1. M ) × 2 ( E ? 127 ) V = (-1)^s \times(1.M)\times 2^{(E-127)} V=(?1)s×(1.M)×2(E?127) (單精度)
V = ( ? 1 ) s × ( 1. M ) × 2 ( E ? 1023 ) V = (-1)^s \times(1.M)\times 2^{(E-1023)} V=(?1)s×(1.M)×2(E?1023)(雙精度)
IEEE 754 半精度浮點(diǎn)數(shù) | 16 位 | 符號(hào) 1 位,指數(shù) 5 位,尾數(shù) 10 位 |
IEEE 754 單精度浮點(diǎn)數(shù) | 32 位 | 符號(hào) 1 位,指數(shù) 8 位,尾數(shù) 23 位 |
IEEE 754 雙精度浮點(diǎn)數(shù) | 64 位 | 符號(hào) 1 位,指數(shù) 11 位,尾數(shù) 52 位 |
代碼實(shí)現(xiàn)計(jì)算
?我們首先定義了一個(gè)函數(shù)binaryIEEE754StringToFloat
,它接收一個(gè)32位的二進(jìn)制字符串作為輸入,并返回一個(gè)浮點(diǎn)數(shù)。該函數(shù)首先確定輸入字符串的長(zhǎng)度,并在必要時(shí)進(jìn)行填充,使其達(dá)到32位。
?接下來(lái),我們解析符號(hào)位、指數(shù)位和尾數(shù)位。符號(hào)位確定數(shù)的正負(fù),指數(shù)位確定數(shù)的范圍,尾數(shù)位確定數(shù)的精度。通過(guò)這些步驟,我們能夠?qū)⒍M(jìn)制字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。
?最后,我們?cè)?code>main函數(shù)中提供了一個(gè)示例二進(jìn)制字符串,并調(diào)用binaryIEEE754StringToFloat
函數(shù)進(jìn)行轉(zhuǎn)換。輸出結(jié)果是一個(gè)浮點(diǎn)數(shù),它就是我們所求的結(jié)果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-813283.html
package main
import (
"fmt"
"math"
"strconv"
"strings"
)
func binaryIEEE754StringToFloat(binaryStr string) float32 {
n := 32 - len(binaryStr)
// 補(bǔ)充為32位
if n >= 0 && n < 32 {
binaryStr = strings.Repeat("0", n) + binaryStr
} else {
fmt.Println("二進(jìn)制字符串的長(zhǎng)度不合法")
return 0
}
// 解析符號(hào)位
sign := 1.0
if binaryStr[0] == '1' {
sign = -1.0
}
// 解析指數(shù)位
(exponent, _ := strconv.ParseInt(binaryStr[1:9], 2, 64))
(exponent -= 127)
// 解析尾數(shù)位
(mantissa := float32(0))
for i := 9; i < len(binaryStr); i++ {
if binaryStr[i] == '1' {
(mantissa += 1 / float32(math.Pow(2, float64(i-8))))
}
}
// 計(jì)算浮點(diǎn)數(shù)值
(result := float32(sign) * (1 + mantissa) * float32(math.Pow(2, float64(exponent))))
return result
}
func main() {
(binaryStr := "10111111100111101110101110000000") // 示例二進(jìn)制字符串
(floatVal := binaryIEEE754StringToFloat(binaryStr))
fmt.Printf("轉(zhuǎn)換后的浮點(diǎn)數(shù)為: %f\n", floatVal)
}
補(bǔ)充(Double類型轉(zhuǎn)換):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-813283.html
func BinaryDoubleStringToFloat(binaryStr string) float64 {
// 補(bǔ)充為64位
n := 64 - len(binaryStr)
if n >= 0 && n < 64 {
binaryStr = strings.Repeat("0", n) + binaryStr
} else {
fmt.Println("二進(jìn)制字符串的長(zhǎng)度不合法")
return 0
}
// 解析符號(hào)位
sign := 1.0
if binaryStr[0] == '1' {
sign = -1.0
}
// 解析指數(shù)位
exponent, _ := strconv.ParseInt(binaryStr[1:12], 2, 64)
exponent -= 1023 // 雙精度指數(shù)位的偏移量
// 解析尾數(shù)位
mantissa := float64(0)
for i := 12; i < len(binaryStr); i++ {
if binaryStr[i] == '1' {
mantissa += 1 / float64(math.Pow(2, float64(i-11)))
}
}
// 計(jì)算浮點(diǎn)數(shù)值
result := sign * (1 + mantissa) * math.Pow(2, float64(exponent))
return result
}
到了這里,關(guān)于【Golang】IEEE754標(biāo)準(zhǔn)二進(jìn)制字符串轉(zhuǎn)為浮點(diǎn)類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!