【问题标题】:Create float from exponent and significand从指数和有效数创建浮点数
【发布时间】:2019-04-16 00:55:44
【问题描述】:

给定整数exp0<=sig<2^52,如何创建以exp 为指数且其有效位与sig(在Go 中)的二进制表示相同的float64?

【问题讨论】:

    标签: go floating-point binary


    【解决方案1】:

    IEEE-754 standard 定义了 Go 用于浮点数的浮点运算,例如 float32float64(就像几乎任何其他语言一样)。

    由于您的有效位可能高达 52 位,显然它只能使用 float64 值来表示。

    float64 值的内存布局(位)在Double-precision floating-point format 中进行了描述。

    这是float64 值的位图(取自维基百科):

    您声称您拥有指数值和有效数字(即小数部分)。

    您可以使用简单的按位运算来构造浮点的 64 位值,如下所示:

    bits := exp<<52 | sig
    

    (注意:expsig 应该是 uint64 类型。如果不是,请使用类型转换。)

    一旦你有了这些位,你可以使用math.Float64frombits() 函数将它作为float64 值:

    f := math.Float64frombits(bits)
    

    请注意,内存布局的指数值不是计算数字值时必须使用的“直接”数字,而是:

    双精度二进制浮点指数使用offset-binary 表示编码,零偏移量为1023;在 IEEE 754 标准中也称为指数偏差。

    所以以上述双精度格式编码的数字计算如下:

    (-1)符号 x 2e-1023 x 1.fraction

    【讨论】:

    • Math.Ldexp 会在这里帮忙吗? func Ldexp(frac float64, exp int) float64
    • @aMike 我正在考虑它,但它将分数作为float64 值,并且它在引擎盖下做了类似的事情。
    • 我明白了,所以如果我希望实际指数为exp,我必须使用bits := (exp+1023)&lt;&lt;52 | sig,对吗?
    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多