I’m trying to divide some large numbers in Python but i’m getting some strange results
NStr = "7D5E9B01D4DCF9A4B31D61E62F0B679C79695ACA70BACF184518" \
"8BDF94B0B58FAF4A3E1C744C5F9BAB699ABD47BA842464EE93F4" \
"9B151CC354B21D53DC0C7FADAC44E8F4BDF078F935D9D07A2C07" \
"631D0DFB0B869713A9A83393CEC42D898516A28DDCDBEA13E87B" \
"1F874BC8DC06AF03F219CE2EA4050FA996D30CE351257287"
N = long(NStr, 16)
f2 = 476
fmin = N / float(f2)
print N - (fmin * float(f2))
This outputs as 0.0 as expected. However if I, for example, change the code to
fmin = N / float(f2)
fmin += 1
I still get an output of 0.0
I also tried using the decimal package
fmin = Decimal(N) / Decimal(f2)
print Decimal(N) - (fmin * Decimal(f2))
But that gives me an output of -1.481136900397802034028076389E+280
I assume i’m not telling python how to handle the large numbers properly, but i’m stumped on where to go from here.
I should also add that the end goal is to calculate
fmin = ceil(N / float(f2))
as a long and as accurate as possible
Expanding on my comment, if
Nandf2arelongs strictly greater than 0, thenis exactly
ceil(N / float(f2))(but even more accurately than using floats).(The use of
//rather than/for integer division is for compatibility with Python 3.x for no extra effort.)It is because
N // f2gives you (basically)floor(N / float(f2))and soN // f2 + 1is almost always the same asceil. However, whenNis a multiple off2,N // f2 + 1is too large (the+1shouldn’t be there) but usingN - 1fixes this, and doesn’t break the other case.(This doesn’t work for either
N,f2less than or equal to 0, but that can handled separately)