亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Golang 中計算 256 位整數的 log16

如何在 Golang 中計算 256 位整數的 log16

Go
忽然笑 2023-04-24 16:48:08
如何獲取以 16 為基數的數學/大 Int 變量的日志。任何幫助都會很棒,因為我是 Go 的新手并且來自 Python 和 C 環境s := "c6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24" // Hex valuei := 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 = 0xc6d86e5a2cb4bc532361c2d4940f0b1a0138066e25d65c1c530d080b11f8ca24a>> 89940344608680314083397671686667731393131665861770496634981932531495305005604Lmath.log(a)/math.log(16.0)答案原來是 63.908875905794794
查看完整描述

3 回答

?
慕俠2389804

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 個精確數字


查看完整回答
反對 回復 2023-04-24
?
尚方寶劍之說

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,可能是泰勒級數的實現,在我看來這將是非常重要的。我鏈接到的線程表明可能存在一個或多個這樣的實現,但不一定在計算上是正確的。


查看完整回答
反對 回復 2023-04-24
?
守著一只汪

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)))


}


查看完整回答
反對 回復 2023-04-24
  • 3 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號