Golang Float64bits

时间:2016-06-10 23:06:14

标签: go

我正在尝试理解Go Sqrt实现,并且无法完全理解Float64bits函数的用途。我在下面有一些测试代码和输出。为什么ix的值会因此操作而发生如此大的变化?

package main

import ("math"
        "fmt")

func main()  {

    var x float64 = 4
    fmt.Printf("The value of x is: %v \n", x)

    ix := math.Float64bits(x)
    fmt.Printf("The value of ix is: %v \n", ix)
    fmt.Printf("The type of ix is: %T \n", ix)

}
The value of x is: 4 
The value of ix is: 4616189618054758400 
The type of ix is: uint64 

3 个答案:

答案 0 :(得分:2)

从文档中,它将float64转换为uint64而不更改位,这是解释位变化的方式。

以下是Float64bits函数的完整源代码:

func Float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }

不要害怕使用不安全指针的语法技巧,它在Go的源代码中很常见(避免复制数据)。所以,这真的很简单:获取给定float的二进制数据并将其解释为无符号整数。

它变化如此之大的原因是浮点数的表示。根据规范,浮点数由符号,指数和尾数组成。

在64位浮点数上,符号为1位,指数为11位,尾数为52位。

4位作为64位浮点数的表示是:

0b0100 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  SEEE EEEE EEEE MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM

如果解释为无符号整数,则该值为4616189618054758400。您将在网上找到大量关于IEEE754的精彩教程,以便完全理解上述值是如何表示4。

答案 1 :(得分:1)

正如documentation所说,该函数只是将构成浮点数据的数据解释为uint64。

IEEE 754 double有这个位布局:

SEEEEEEE EEEEMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

这些是64位,包括:

  • 一个符号位S
  • 指数位E
  • 尾数位M

4.0等于此位表示:

01000000 00010000 00000000 00000000 00000000 00000000 00000000 00000000

详细解释为什么看起来这样太冗长了。关于尾数有一些特殊的规则在这里发挥关键作用。我们现在可以忽略它,如果您对以IEEE浮点格式表示数字的所有脏信息感兴趣,请查看链接的文档。

上述函数不会将这些64位视为uint64。最后,这只是投射了一堆恰好适合uint64的位。因此,结果数与浮点值完全不同。

答案 2 :(得分:1)

在fmt.Printf中使用%#X来格式化十六进制值。和%[1]一样引用第一个arg,例如这个示例代码:

package main

import "fmt"
import "math"

func main() {
    var x float64 = 4
    fmt.Println("x =", x)

    ix := math.Float64bits(x)
    fmt.Printf("bits: %#X = %[1]v %[1]T\n", ix)
}

输出:

x = 4
bits: 0X4010000000000000 = 4616189618054758400 uint64

并看到:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format https://en.wikipedia.org/wiki/IEEE_floating_point

Why does adding 0.1 multiple times remain lossless?

golang: what does "%b" do in fmt.Printf for float64 and what is Min subnormal positive double in float64 in binary format?

我希望这会有所帮助。