如何获取以16为底的数学/大Int变量的日志。
由于我是Go语言的新手,并且来自Python和C环境,因此任何帮助都是很棒的
s := "c6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24" // Hex value
i := new(big.Int)
i.SetString(s, 16) // hex value to Big Int
// how to get the log with base 16 for a math/big Int variable.
它如何在python中工作
import math
a = 0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24
a>> 89940344608680314083397671686667731393131665861770496634981932531495305005604L
math.log(a)/math.log(16.0)
答案原来是63.908875905794794
答案 0 :(得分:4)
对于log16和十六进制输入,有一种特殊的方法,无需长运算。
要获取整数(满底)结果,只需计算十六进制数字即可。在这种情况下,有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位数字
答案 1 :(得分:2)
对数的一个有趣特性是,基数更改实际上非常容易。
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,那么这似乎是目前最好的解决方案,它可能是泰勒级数实现,在我看来,编写它并非易事。我链接到的线程表示可能存在一个或多个这样的实现,但不一定在计算上正确。
答案 2 :(得分:1)
首先,您需要通过在开头添加“ 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)))
}