Go 如何将float64(存储为base-2)转换为base-10中的系数和指数?

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" )

我正在寻找一种算法,该算法采用64位浮点数并输出指数和系数,因此输入可以表示为
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。