LearningScalaMaterials icon indicating copy to clipboard operation
LearningScalaMaterials copied to clipboard

Use long to get first 100 fibonacci will cause overflow

Open flashlib opened this issue 5 years ago • 0 comments

In Chapter 7 exercise 1.c, as the first 100 of fibonacci numbers will exceed 64bits numbers, you can't use Int but also Long too! See the result below(The answer here just show first 60 numbers which is OK):

fib: (a: Long, b: Long)Stream[Long]
1,1,2,3,5,8,13,21,34,55
89,144,233,377,610,987,1597,2584,4181,6765
10946,17711,28657,46368,75025,121393,196418,317811,514229,832040
1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155
165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025
20365011074,32951280099,53316291173,86267571272,139583862445,225851433717,365435296162,591286729879,956722026041,1548008755920
2504730781961,4052739537881,6557470319842,10610209857723,17167680177565,27777890035288,44945570212853,72723460248141,117669030460994,190392490709135
308061521170129,498454011879264,806515533049393,1304969544928657,2111485077978050,3416454622906707,5527939700884757,8944394323791464,14472334024676221,23416728348467685
37889062373143906,61305790721611591,99194853094755497,160500643816367088,259695496911122585,420196140727489673,679891637638612258,1100087778366101931,1779979416004714189,2880067194370816120
4660046610375530309,7540113804746346429,-6246583658587674878,1293530146158671551,-4953053512429003327,-3659523366270331776,-8612576878699335103,6174643828739884737,-2437933049959450366,3736710778780434371

We can verify this using the following code:

val test: Long = 4660046610375530309l + 7540113804746346429l
val maxLong = Long.MaxValue
val max: BigInt = BigInt(2).pow(63) - 1
val big: BigInt = BigInt(4660046610375530309l) + BigInt(7540113804746346429l)

The output is:

test: Long = -6246583658587674878
maxLong: Long = 9223372036854775807
max: BigInt = 9223372036854775807
big: BigInt = 12200160415121876738

As we can see use BigInt will fix the overflow problem:

fib: (a: BigInt, b: BigInt)Stream[BigInt]
1,1,2,3,5,8,13,21,34,55
89,144,233,377,610,987,1597,2584,4181,6765
10946,17711,28657,46368,75025,121393,196418,317811,514229,832040
1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155
165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025
20365011074,32951280099,53316291173,86267571272,139583862445,225851433717,365435296162,591286729879,956722026041,1548008755920
2504730781961,4052739537881,6557470319842,10610209857723,17167680177565,27777890035288,44945570212853,72723460248141,117669030460994,190392490709135
308061521170129,498454011879264,806515533049393,1304969544928657,2111485077978050,3416454622906707,5527939700884757,8944394323791464,14472334024676221,23416728348467685
37889062373143906,61305790721611591,99194853094755497,160500643816367088,259695496911122585,420196140727489673,679891637638612258,1100087778366101931,1779979416004714189,2880067194370816120
4660046610375530309,7540113804746346429,12200160415121876738,19740274219868223167,31940434634990099905,51680708854858323072,83621143489848422977,135301852344706746049,218922995834555169026,354224848179261915075

flashlib avatar May 01 '19 23:05 flashlib