美文网首页
Float32 & Float64 值的计算方式

Float32 & Float64 值的计算方式

作者: Sun东辉 | 来源:发表于2022-06-03 09:46 被阅读0次

遵循 IEEE 754 标准(所有新式 CPU 都支持该标准),浮点数在计算机中的存储,分为三部分:

  1. 符号位,区分正数还是负数。
  2. 指数部分, float32 在 [0,255]区间内, Float64 在 [0,2047]区间内。
  3. 有效数字部分,在[0,1]区间内。

浮点数的值 = 符号位指数部分的值有效数字部分的值

Float32 数值的具体的计算过程如下:

package main

import (
    "fmt"
    "github.com/imroc/biu"
    "math"
    "strconv"
    "strings"
)

func main() {
    var i float32 = 99.99
    exponentLen := 8           // 指数部分的长度
    var middleware int64 = 127 // 中间数
    // 获取完整的二进制存储值
    str := biu.ToBinaryString(math.Float32bits(i))
    fmt.Println("str: ", str)
    // 只保留 0101 值
    newStr := strings.ReplaceAll(str[1:len(str)-1], " ", "")
    fmt.Println("newStr: ", newStr)
    // 数值切分逻辑

    sign := newStr[0:1]
    exponent := newStr[1 : 1+exponentLen]
    fraction := newStr[1+exponentLen:]
    fmt.Println("sign: ", sign)
    fmt.Println("exponent: ", exponent)
    fmt.Println("fraction: ", fraction)
    // 指数部分值计算逻辑
    decimalExponent, _ := strconv.ParseInt(exponent, 2, 32)
    fmt.Println("decimalExponent: ", decimalExponent)
    exponentValue := 1 << (decimalExponent - middleware)
    fmt.Println("exponentValue: ", exponentValue)
    // 有效数字部分计算逻辑
    decimalFraction, _ := strconv.ParseInt(fraction, 2, 32)
    fmt.Println("decimalFraction: ", decimalFraction)
    dividend := 1 << (len(newStr) - 1 - exponentLen)
    fractionValue := float64(decimalFraction)/float64(dividend) + 1
    fmt.Println("fractionValue: ", fractionValue)

    fmt.Println(fractionValue * float64(exponentValue))
}

// 打印结果
/*          
str:  [01000010 11000111 11111010 11100001]
newStr:  01000010110001111111101011100001
sign:  0
exponent:  10000101
fraction:  10001111111101011100001
decimalExponent:  133
exponentValue:  64
decimalFraction:  4717281
fractionValue:  1.562343716621399
99.98999786376953
*/

对于 Float64 数值,只需要

  • 将 exponentLen 的值改为 11;
  • 将 middleware 的值改为 1023。

相关文章

  • Float32 & Float64 值的计算方式

    遵循 IEEE 754 标准(所有新式 CPU 都支持该标准),浮点数在计算机中的存储,分为三部分: 符号位,区分...

  • 基本数据类型

    整型 浮点数 float32 float64 复数complex64complex128 布尔型 字符串 常量

  • Go语言的常量与变量

    数据类型 go语言支持常见的数据类型。 数字:go语言支持整型int和浮点型float32/float64。位运算...

  • Go语言之浮点类型(小数类型)六

    Go语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754 标准: ...

  • go精度问题

    一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十...

  • NN八股

    1 张量 Tensor(“add:0”,shape=(2,),dtype =float32 )计算图会话 with...

  • 数据透视表高级应用

    一、值显示方式 (一)自动计算占比和排名 1. 自动计算占比。 (1)手工计算(费时、麻烦) (2)值显示方式—总...

  • 第十八天:.数据透视高级应用2018-10-26

    一、强大的“值显示方式” 1、计算百分比 step:将要计算的百分比的值拉入值区域,点击单元格右键——值显示方式—...

  • 2018-08-19数据透视高级应用

    一 自动计算占比和排名 1 值显示方式: ------ 值显示方式 – 降序排列 在要降序的列,右键:值显示方式 ...

  • 六边形

    六边形值计算方式

网友评论

      本文标题:Float32 & Float64 值的计算方式

      本文链接:https://www.haomeiwen.com/subject/vchtmrtx.html