Simplifiy your problem, using a bit of math.
Note that sqrt(a*b) = sqrt(a) * sqrt(b)
(for real, positive numbers at least).
So, any number larger than, say, 10^100, divide by 10^100. That's a
, and the result of the division is b
, so that your original number = a * b
.
Then use the square root of 10^100 (= 10^50), multiply that by the square root of b
, and you have your answer.
With your example:
import math
x = 10**309
a = 1e100
b = 1e209 # Note: you can't calculate this within Python; just use plain math here
y = 1e50 * math.sqrt(1e209)
Example for a not-so-round number:
x = 3.1415 * 1e309
a = 1e100
b = 3.1415e209 # Again, just subtract the exponent: 309 - 100
y = 1e50 * math.sqrt(3.1415e209)
Or for an integer that's not a power of 10, fully written out:
x = 707070
x = 70.707 * 1e4 # note: even number in exponent
x = 70.707e4
a = 1e2 # sqrt(1e2) = 1e1 = 10
b = 70.707e2
y = 10 * sqrt(70.707e2)
A few notes:
Python handles ridiculously large integer numbers without problems. For floating point numbers, it uses standard (C) conventions, and limits itself to 64 bit precision. You almost always get floating point numbers when taking a square root of something.
1e309
means 10**309
, and 3.1415e209
means 3.1415 * 10**209
. This is a standard programming convention.