Go 为什么这个节目人满为患?

Go 为什么这个节目人满为患?,go,integer-overflow,Go,Integer Overflow,我有一个小的golang程序,它计算第I个fibonnaci数,但是对于某些大数,它似乎会溢出,即使数组更改为int64类型。为什么会这样 package main import "fmt" func main() { fib(555) //prints a negative number } func fib(num int) { queue := []int{0, 1} for i := 0; i < num; i++ { next

我有一个小的golang程序,它计算第I个fibonnaci数,但是对于某些大数,它似乎会溢出,即使数组更改为
int64
类型。为什么会这样

package main

import "fmt"

func main() {
    fib(555) //prints a negative number

}

func fib(num int) {

    queue := []int{0, 1}

    for i := 0; i < num; i++ {
        next := queue[0] + queue[1]
        queue[0] = queue[1]
        queue[1] = next
    }

    fmt.Println(queue[len(queue)-1])

}
主程序包
输入“fmt”
func main(){
fib(555)//打印一个负数
}
func fib(num int){
队列:=[]整数{0,1}
对于i:=0;i
因为第555个斐波那契数是

43516638122555047896418053731403947254072003726072973588566439865577574803495772577926560502782976758877570


因为第555个斐波那契数是

43516638122555047896418053731403947254072003726072973588566439865577574803495772577926560502782976758877570


即使对于int64也太大了。

斐波那契序列变得非常大,非常快。您需要使用包来计算如此大的整数。翻译您的算法可以为我们提供:

queue := []*big.Int{big.NewInt(0), big.NewInt(1)}

for i := 0; i < num; i++ {
    next := new(big.Int).Add(queue[0], queue[1])
    queue[0] = queue[1]
    queue[1] = next
}
queue:=[]*big.Int{big.NewInt(0),big.NewInt(1)}
对于i:=0;i
或者更简洁地说:

for i := 0; i < num; i++ {
    queue[0].Add(queue[0], queue[1])
    queue[0], queue[1] = queue[1], queue[0]
}
i:=0的
;i

它将以
555
作为输入输出以下数字:

70411399558423479787498867358975911087747238266614004739546108912183281780345203522889578644544982403856194431208467


(这与预期的555斐波那契数相差1,因为它的索引为0)

斐波那契序列变得非常大,非常快。您需要使用包来计算如此大的整数。翻译您的算法可以为我们提供:

queue := []*big.Int{big.NewInt(0), big.NewInt(1)}

for i := 0; i < num; i++ {
    next := new(big.Int).Add(queue[0], queue[1])
    queue[0] = queue[1]
    queue[1] = next
}
queue:=[]*big.Int{big.NewInt(0),big.NewInt(1)}
对于i:=0;i
或者更简洁地说:

for i := 0; i < num; i++ {
    queue[0].Add(queue[0], queue[1])
    queue[0], queue[1] = queue[1], queue[0]
}
i:=0的
;i

它将以
555
作为输入输出以下数字:

70411399558423479787498867358975911087747238266614004739546108912183281780345203522889578644544982403856194431208467


(这与预期的555斐波那契数相差1,因为它的索引为0)

第555斐波那契数是
435166388122550478964180537314039472540722020372607297358856643986557748034957725779265605027829758677570
,它甚至不接近于一个整数,并且已经滚动了多次。
int64
可以处理的最大整数值是什么?比如说,这与你的
fib(100)
相比如何?奇怪的是,你竟然把这个问题标记为
整数溢出
,却(似乎)不明白它的意思!555斐波那契数是
4351663812255504779896418053731403947254072003726072973588566486557757480349725779265605027785297675867877570
,它甚至不接近于一个整数,并且已经滚动了多次。
int64
能处理的最大整数值是多少?比如说,这与你的
fib(100)
相比如何?奇怪的是,你竟然把这个问题标记为
整数溢出
,却(似乎)不明白它的意思!为什么数组的类型是
*big.Int
而不仅仅是
big.Int
?可能是因为big.Int上的每个方法都需要指针接收器为什么数组的类型是
*big.Int
而不仅仅是
big.Int
?可能是因为big.Int上的每个方法都需要指针接收器