2 回答
TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
我拿走了你的程序(你的第一個(gè)括號(hào)是多余的,所以我刪除了):
S K
--- * ( N + ------ )
M 8192
--------------------
P
并運(yùn)行了QuickMath [1],我得到了這個(gè):
S * (8192 * N + K)
------------------
8192 * M * P
或在 Go 代碼中:
S * (8192 * N + K) / (8192 * M * P)
因此,它確實(shí)減少了除法的數(shù)量。您可以通過(guò)拉出下限常量來(lái)進(jìn)一步改進(jìn)它:
S * (8192 * N + K) / (M * P) >> 13
https://quickmath.com
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
通過(guò)@StevenPerry來(lái)查看答案,我意識(shí)到大多數(shù)誤差是由我們必須表示的有限精度引起的 。然后,此錯(cuò)誤會(huì)傳播到其他因素和紅利中。K/8192
然而,推遲這種除法通常會(huì)導(dǎo)致整數(shù)溢出,然后再達(dá)到它。因此,不幸的是,我發(fā)現(xiàn)的解決方案取決于將這些操作數(shù)擴(kuò)大到64位。
結(jié)果與其他答案具有相同的形式,但必須強(qiáng)調(diào)的是,將操作數(shù)擴(kuò)大到64位至關(guān)重要。在 Go 源代碼中,如下所示:
var S, N, M, P, K uint32 ... F := uint32(uint64(S) * uint64(8192*N+K) / uint64(8192*M*P))
若要查看所有這三個(gè)表達(dá)式的準(zhǔn)確性,請(qǐng)?jiān)?Go Playground 上自行運(yùn)行代碼。
- 2 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報(bào)
