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

如何计算Golang中256位整数的log16,go,math,Go,Math,如何获取math/big Int变量以16为基数的日志 任何帮助都会很好,因为我是新手,来自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/b

如何获取math/big Int变量以16为基数的日志

任何帮助都会很好,因为我是新手,来自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

对数的一个有趣特性是,改变基数实际上非常容易

log_b (x) = log_a (x) / log_a (b)
因此,如果您想获得log_16 x,您可以使用该函数并更改基数:

log_e (x) = log_16 (x) / log_16 (e)
log_16 (e) = approximately 0.36067 
=> log_16 (x) = 0.36067 * log_e (x)
所以在围棋中,我认为这应该是:

li := Log(i) * 0.36067

编辑:当我写上面的答案时,我没有意识到日志在一个大的Int上不起作用。阅读,这似乎是该语言中的一个请求功能,由于缺乏令人满意的快速解决方案,该功能尚未实现。从我所读到的来看,如果你必须使用一个大的Int,那么目前最好的解决方案可能是一个泰勒级数实现,在我看来,这是非常容易编写的。我链接到的线程表示可能存在一个或多个这样的实现,但计算不一定正确。

首先,您需要通过在开头添加0x将十六进制字符串转换为正确的十六进制表示法。接下来写一个log16方法,使用strconv获取整数,而不是float64作为log方法的输入。警告:此解决方案不处理整数溢出


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

log函数接受float64类型参数,但我有一个大的Int@MohitGupta明白了!那么我的回答是不够的。今天下午我来看看;希望其他人能在那之前找到答案。位溢出了64,这个数字对它来说真的很大。请查看我的编辑以了解问题。答案是15.75,但应该是63.908875905794794对不起,我没有考虑这个问题。我不知道任何现有的实现。在java中有packagemath/big/decimal和一个解决自然对数的实现,也许您可以从那里开始。
fp = p - Floor(p) = 0.908875905775919
log16(0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24) = 
      63 + 0.908875905775919 = 63.908875905775919