Golang中float64的位运算操作解析
Golang中float64的位运算操作解析 我读到一篇关于如何快速计算 1/sqrt(x) 的文章。其思路是利用按位对数运算和指针操作(涉及指数和尾数的浮点数表示)。
例如:
var y float64
var i int64
i = *(long *)&y // 邪恶的浮点数位级操作
我不太理解这个操作。当我在 Go Playground 上尝试运行它时,出现了错误:
func main() {
var y = 2.15
var i int64
i = *(int64 *)&y // 错误:语法错误:遇到 ')',期望表达式
i = 0x5f3759df - (i>>1)
y = *(float64*)&i // 错误:语法错误:遇到 ')',期望表达式
fmt.Println(y)
}
有人可以为我解惑吗?谢谢
更多关于Golang中float64的位运算操作解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
你好 Petrus 非常感谢你的帮助。 更重要的是,我从你这里学到了如何在 Go 语言中进行底层的浮点数位操作。 再次非常感谢!
更多关于Golang中float64的位运算操作解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
// Fast inverse square root
// https://en.wikipedia.org/wiki/Fast_inverse_square_root
package main
import (
"fmt"
"math"
)
func RSqrt(number float64) float64 {
const threehalfs = 1.5
x2 := number * 0.5
y := number
i := int64(math.Float64bits(y)) // evil floating point bit level hacking
i = 0x5FE6EB50C7B537A9 - (i >> 1) // what the f@#!?
y = math.Float64frombits(uint64(i))
y = y * (threehalfs - (x2 * y * y)) // 1st iteration
y = y * (threehalfs - (x2 * y * y)) // 2nd iteration
y = y * (threehalfs - (x2 * y * y)) // 3rd iteration
y = y * (threehalfs - (x2 * y * y)) // 4th iteration
return y
}
func main() {
number := 0.15625
fmt.Printf("%g\n", number)
rsqrt := RSqrt(number)
fmt.Printf("%g\n", rsqrt)
rsqrt = 1 / math.Sqrt(number)
fmt.Printf("%g\n", rsqrt)
}
https://play.golang.org/p/o5w-TaqKjZQ
0.15625
2.5298221281347035
2.5298221281347035


