Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use long to get first 100 fibonacci will cause overflow #11

Open
flashlib opened this issue May 1, 2019 · 0 comments
Open

Use long to get first 100 fibonacci will cause overflow #11

flashlib opened this issue May 1, 2019 · 0 comments

Comments

@flashlib
Copy link

flashlib commented May 1, 2019

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant