猿问

如何在 Golang 中计算 256 位整数的 log16

如何获取以 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


忽然笑
浏览 160回答 3
3回答

慕侠2389804

对于 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 个精确数字

尚方宝剑之说

对数的一个有趣特性是基数变化实际上非常容易。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,可能是泰勒级数的实现,在我看来这将是非常重要的。我链接到的线程表明可能存在一个或多个这样的实现,但不一定在计算上是正确的。

守着一只汪

首先,您需要通过在开头添加“0x”将十六进制字符串转换为正确的十六进制表示法。接下来写一个log16方法,用来strconv获取整数,而不是float64用于方法的输入log。注意:此解决方案不处理整数溢出。package mainimport (    "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)))}
随时随地看视频慕课网APP

相关分类

Go
我要回答