gpt4 book ai didi

go - Golang big.Float的精度问题

转载 作者:IT王子 更新时间:2023-10-29 02:28:18 26 4
gpt4 key购买 nike

我在Golang big.Float计算中遇到了一些有趣的问题。

问题是

10001000100010001000100010001000100010001000100015.5533/1000000000000000000

= 10001000100010001000100010001000.1000100010001000155533

However, big.Float gave "10001000100010001000100010001000.10001000100010001555329999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997"

代码:

var prec uint = 1024 // 512
dec, _ := new(big.Float).SetPrec(prec).SetString("1000000000000000000")
f, _ := new(big.Float).SetPrec(prec).SetString("10001000100010001000100010001000100010001000100015.5533")
q := f.Quo(f, dec)

fmt.Printf("Percision: %d\n", prec)
fmt.Printf("Quotient: %s\n", q.Text('f', -1))

结果:

Percision: 1024
Quotient: 10001000100010001000100010001000.10001000100010001555329999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997

更令人困惑的是,如果我设置 prec = 512,一个更小的精度,它反而会产生正确的结果。

Percision: 512
Quotient: 10001000100010001000100010001000.1000100010001000155533

有谁知道我的代码有什么问题或如何配置 big.Float 以获得预期结果?

感谢大家!

最佳答案

来自 go doc math/big.Float:

A nonzero finite Float represents a multi-precision floating point number

sign × mantissa × 2**exponent

with 0.5 <= mantissa < 1.0, and MinExp <= exponent <= MaxExp.

并且 SetPrec 设置尾数的位宽而不是一些小数精度。

与 float64s 一样,并非每个十进制数都可以在 big.Float 中精确表示,您的代码显示了这一点。您在 prec=512 中看到您期望看到的是由于不同的舍入和打印。

经验法则:big.Floats 的行为类似于“普通” float ,但有其所有缺点(这里不是每个小数都可以表示)但可能会显示较少的舍入错误。

关于go - Golang big.Float的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com