Go中的浮点精度

Go中的浮点精度,go,floating-accuracy,Go,Floating Accuracy,这个问题是我的后续问题。我收到的答案建议我使用Go math.大图书馆。在这个问题上,我使用了这个库,但不幸的是效果甚微 我试图用比奈公式来计算fib100。我正在使用 围棋很大,但没有成功。我得到的精度约为10位小数 地方。请告知 我正试图避免循环/递归,因为我认为这些方法会 比例不好。因此,我试图利用比奈的公式 //当前,随着输入的增加,会产生不准确的结果 package main import ( "fmt" "math/big" "math" "strc

这个问题是我的后续问题。我收到的答案建议我使用Go math.大图书馆。在这个问题上,我使用了这个库,但不幸的是效果甚微

我试图用比奈公式来计算fib100。我正在使用 围棋很大,但没有成功。我得到的精度约为10位小数 地方。请告知

我正试图避免循环/递归,因为我认为这些方法会 比例不好。因此,我试图利用比奈的公式

//当前,随着输入的增加,会产生不准确的结果

package main

import (
    "fmt"
    "math/big"
    "math"
    "strconv"
)

func fib(n int) float64  {
    var sroot5 = new(big.Float).SetPrec(200).SetFloat64(2.236067977499789696409173668731276235440618359611525724270897)
    var phi = new(big.Float).SetPrec(200).SetFloat64(1.61803398874989484820458683436563811772030917980576286213544862)
    var minusPhi = new(big.Float).SetPrec(200).SetFloat64(-0.61803398874989484820458683436563811772030917980576)

    var fltP float64;
    fltP, _ = phi.Float64()

    var fltN float64;
    fltN, _ = minusPhi.Float64()

    var denom float64
    denom, _ = sroot5.Float64()

    // Magic fib formula (Binet) is:
    // (Phi ^ n - (-phi ^ n)) / sqrt(5)

    z := (math.Pow(fltP, float64(n)) - math.Pow(fltN, float64(n))) / denom 

    return math.Ceil(z) 

}

func main() {

    fib(100)

    fmt.Println(strconv.FormatFloat(fib(100), 'f', 0, 64))
    fmt.Println("true answer of fib(100) should be -> 354224848179261915075")

}
您正在使用

在Go中,要准确计算fib100,您可以简单地说:

package main

import (
    "fmt"
    "math/big"
)

func fib(n int) *big.Int {
    f := big.NewInt(0)
    a, b := big.NewInt(0), big.NewInt(1)
    for i := 0; i <= n; i++ {
        f.Set(a)
        a.Set(b)
        b.Add(f, b)
    }
    return f
}

func main() {
    fmt.Println(fib(100))
}
您正在使用

在Go中,要准确计算fib100,您可以简单地说:

package main

import (
    "fmt"
    "math/big"
)

func fib(n int) *big.Int {
    f := big.NewInt(0)
    a, b := big.NewInt(0), big.NewInt(1)
    for i := 0; i <= n; i++ {
        f.Set(a)
        a.Set(b)
        b.Add(f, b)
    }
    return f
}

func main() {
    fmt.Println(fib(100))
}

阅读并考虑使用一些图书馆,你昨天问了基本相同的事情:注意SETFLAUT64的论点有类型FLUAT64,因此你的高精度在被转换成大浮点之前被截断为浮点64的精度。如果我读对了,你就创造了一堆高精度的变量,然后在使用它们之前,立即将它们转换回标准浮动。所以你不妨完全不要使用Big.Fig.“凯文,你应该使用StStReEngRead并考虑使用一些图书馆,你昨天基本上问了同样的事情:注意StRoFLAT64的参数有FLUAT64型,因此,在转换为大浮点之前,您的高精度将被截断为浮点64的精度。如果我读对了,您将创建一组高精度变量,然后在使用它们之前立即将它们转换回标准浮点。所以你最好完全跳过使用big.Float。@Kevin你应该使用setString谢谢你的回答。我想我是在试图避免当fib的输入很高时,循环的性能不会很好。当您通过100时,您的解决方案非常好,但随着数字的增加,执行速度会变慢。这就是为什么我要尝试比奈的方法。@Kevin计算斐波那契数的最快方法是通过重复的矩阵平方,如前所述。由于结果变得不精确,您真的不想弄乱浮点数。@Kevin,添加100个big.Float可能比使用big.Float.Agreed调用计算Binet公式更快,但添加400万个int会更快吗?谢谢您的回答。我想我是在试图避免当fib的输入很高时,循环的性能不会很好。当您通过100时,您的解决方案非常好,但随着数字的增加,执行速度会变慢。这就是为什么我要尝试比奈的方法。@Kevin计算斐波那契数的最快方法是通过重复的矩阵平方,如前所述。由于结果变得不精确,您真的不想弄乱浮点数。@Kevin,添加100个big.Float可能比使用big.Float.Agreed调用计算Binet公式更快,但添加400万个int会更快吗?