3 回答
TA贡献1719条经验 获得超6个赞
对于 log16 和 hex 输入有特定的方法,无需长时间的算术运算。
要获得整数(底数)结果,只需计算十六进制数字即可。在这种情况下有 63 位数字,所以你有
FloorLog16 = 63
现在得到 8 个第一位数字(更多以提高精度)
b = 0xc6d86e5a
并获得 log16
p = log(b) / log(16) = 7.908875905775919
使用此结果的小数部分使对数更精确
fp = p - Floor(p) = 0.908875905775919 log16(0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24) = 63 + 0.908875905775919 = 63.908875905775919
注意 12 个精确数字
TA贡献1788条经验 获得超4个赞
对数的一个有趣特性是基数变化实际上非常容易。
log_b (x) = log_a (x) / log_a (b)
所以如果你想得到log_16 (x),你可以使用Log函数并改变基数:
log_e (x) = log_16 (x) / log_16 (e)
log_16 (e) = approximately 0.36067
=> log_16 (x) = 0.36067 * log_e (x)
所以在 Go 中,我认为这将是:
li := Log(i) * 0.36067
编辑:当我写上面的答案时,我没有意识到这Log不适用于 Big Int。阅读Go Github,看起来这是该语言的一项请求功能,由于缺乏令人满意的快速解决方案而尚未实现。从我读到的内容来看,目前最好的解决方案是,如果你必须使用 Big Int,可能是泰勒级数的实现,在我看来这将是非常重要的。我链接到的线程表明可能存在一个或多个这样的实现,但不一定在计算上是正确的。
TA贡献1872条经验 获得超3个赞
首先,您需要通过在开头添加“0x”将十六进制字符串转换为正确的十六进制表示法。接下来写一个log16方法,用来strconv获取整数,而不是float64用于方法的输入log。注意:此解决方案不处理整数溢出。
package main
import (
"fmt"
"math"
"strconv"
)
func log16(x float64) float64 {
return math.Log(x)/math.Log(16.0)
}
func main() {
s := "c6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24"
s1 := "0x" + s
h, _ := strconv.ParseInt(s1,0,64)
fmt.Println(log16(float64(h)))
}
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报