Go 如何将float64(存储为base-2)转换为base-10中的系数和指数?
我正在寻找一种算法,该算法采用64位浮点数并输出指数和系数,因此输入可以表示为Go 如何将float64(存储为base-2)转换为base-10中的系数和指数?,go,decimal,floating-point-conversion,Go,Decimal,Floating Point Conversion,我正在寻找一种算法,该算法采用64位浮点数并输出指数和系数,因此输入可以表示为float64 input=coefficient*10^ index 假设这是“不平凡的”,Golang的许多精确十进制格式的实现(没有内置的十进制类型)都有一些技巧,比如转换为字符串并解析它。虽然这个解决方案在我看到的软件包中确实有效,但用数学/计算机科学-y的方法似乎是“合适的”。它可能不是100%精确,但您可以使用Log10: package main import ( "fmt" "math" )
float64 input=coefficient*10^ index
假设这是“不平凡的”,Golang的许多精确十进制格式的实现(没有内置的十进制类型)都有一些技巧,比如转换为字符串并解析它。虽然这个解决方案在我看到的软件包中确实有效,但用数学/计算机科学-y的方法似乎是“合适的”。它可能不是100%精确,但您可以使用Log10:
package main
import (
"fmt"
"math"
)
func parts(v float64) (float64, int) {
e := math.Floor(math.Log10(v))
c := v / math.Pow(10, e)
return c, int(e)
}
func main() {
c, e := parts(1348.234e134)
fmt.Printf("%v * 10^%v", c, e) // 1.3482339999999997 * 10^137
}
这不是一个真正的答案,但如果你愿意尝试go1.5,你可以研究我没有时间将其格式化为答案(如果你开始浏览代码,你可以看到原因),但是将float64转换为字符串基本上是相同的操作,因为字符串表示是以10为基数的。您可以从开始进行转换,这包含了所有的数学知识。太长,读不下去了使用strconv并没有那么糟糕。哦,如果你想看看
fmt
包是如何将其转换为e+符号的,那么在fmt/format.go
中查找fotmatFloat
。精度是我遇到这些麻烦的主要原因。执行此操作时的误差与使用常规浮点时的误差相同吗?如您所见,系数的精度约为10^-17。