go - 从指数和尾数创建 float

标签 go floating-point binary

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

最佳答案

IEEE-754 standard定义了 Go 用于 float 的浮点算法,例如 float32float64(就像几乎所有其他语言一样)。

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

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

这是一张 float64 值的图片(取自维基百科):

enter image description here

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

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

bits := exp<<52 | sig

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

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

f := math.Float64frombits(bits)

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

The double-precision binary floating-point exponent is encoded using an offset-binary representation, with the zero offset being 1023; also known as exponent bias in the IEEE 754 standard.

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

(-1)sign x 2e-1023 x 1.fraction

关于go - 从指数和尾数创建 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53276811/

相关文章:

c++ - 为什么我不能使用浮点值作为模板参数?

python - Python 中二进制的浮点表示(位非十六进制)

C-游程编码不适用于大文件,适用于较小的文件

c - 为什么这段代码与 bin 一起使用时会崩溃?

go - 在 Web 应用程序中运行计划任务

go - 使用 godoc 启动本地文档服务器时出现问题

Golang升序

java - 如何在 Java 中将十六进制字符串转换为 float ?

go - 如何从多个 goroutine 写入同一个 channel

floating-point - 了解这些 float 如何工作?