My integers in Ruby (MRI) refuse to overflow. I’ve noticed the class change from fixnum to bignum but I’m wondering how this is modeled and what sort of process ruby uses to perform arithmetic on these massive integers. I’ve seen this behaviour in SCHEME as well as other environments.
I ask because I’d like to implement something similar in a C program and would like to know how bignum + bignum reduces to primitive operations.
Any pointers?
Python also does this.
Basically, instead of treating a number as a string of bits that naturally fits the hardware architecture, (32 bits for instance) it treats a number as a string of 32-bit digits, then implements all the arithmetic operations to handle carries from one 32-bit digit to another. That also involves allocating additional 32 bit digits as the number grows longer. This is easier than it seems.
For instance, 99 * 99 is less that 100 * 100 which is 10,000, therefore one might assume that multiplying two 2-digit numbers will produce a result no longer than 4 digits. Same thing applies when each digit is a 32-bit word.
You might want to try implementing this in Ruby, just for fun, using some type that allows fixed binary quantities. I believe the FixNum class would work.