Convert any number (up to 1e3000) to text
To get the ball rolling then, this is my version. Only the final number is converted to a float so there is no problem with large numbers if they're within range.
In terms of speed, it takes about 0.85 seconds to calculate 1000 random integers between -1e3000 and 1e3000.
Python 2 (574)
N=str(X).split('.');K=len;E=min(1000,(K(str(abs(int(N[0]))))-1)/3);P=N[0][:(-E*3if E else K(N[0]))];L=K(P);B=''.join(N);O='%.2f'%float((P+'.'+((B[L:L+3])or'0')));m,n,o,p,q,r,s,t,u,v,w,x,y,z='illion quadr quin sex sept oct non ing ag g tre duo c t'.split();a=[''];l=a+['thousand']+[i+m for i in['m','b','tr',n,o+z,p+z,q,r,s]]+[i+j+k for i in a+[i+'en'for i in[y,x+y,w+y,n+t,o+v,'sesc',q+t,r+t,s+v]]for k in[C+m for C in[z,'dec']+[B+'int'for B in['vig','trig',n+u,o+'quag',p+u,q+'uag',r+'og',s+u]]][not i:]for j in a+['un',x,w,'quattor',o,p,q+'en',r+'o','novem']];print O,l[E]

Then with some test cases:
&gt;&gt;&gt; X = 100
100.0
&gt;&gt;&gt; X = '100.0'
100.0
&gt;&gt;&gt; X = '1037093920'
1.04 billion
&gt;&gt;&gt; X = '-1540420004036040042.400642'
-1.54 quintillion
&gt;&gt;&gt; X = '1540420' + '0'*153
1.54 duoquinquagintillion
&gt;&gt;&gt; X = '1540496' + '0'*1553
154.05 quingenoctodecillion

Past the limit (just to show it doesn't throw an error and still handles negative value):
&gt;&gt;&gt; X = '-10935' + '6'*3005
-1093566666.67 nongennovemnonagintillion
&gt;&gt;&gt; X = '10935' + '6'*3250
1.09356666667e+254 nongennovemnonagintillion
&gt;&gt;&gt; X = '10935' + '6'*3500
inf nongennovemnonagintillion