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條經驗 獲得超4個贊
首先,您需要通過在開頭添加“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 關注
- 221 瀏覽
添加回答
舉報