NullLogic

...

#!/usr/bin/nsp /* * SQRT() sample prog by Dan Cahill * * calculate precise square roots without libm. * minor tweaks are obvious and boring. don't bother. * * it sucks for a proc to do it this way, but i'm testing a method for humans. * good logic will translate. bad logic isn't worth the effort. * * every floor()ed square root from 0 to 100. a monkey could memorize this. * swapping this for a float table would probably save one whole cycle. * the square root of zero _is_ zero, but one in its place makes decimals work. */ function mysqrt(vol) { local square = { 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 } local vt=tonumber(vol); local depth=0; local base1=0; if (vt<0) { print("You cannot calculate the base of a negative volume.\r\n"); return; } while (vt>100) { vt/=100; depth++; } base1=square[math.floor(vt)]; while (depth--) base1*=10; print("\nthe square root of ",vol," is...\n"); vol=tonumber(vol); for (i=0;i<5;i++) { if ((diff=vol/base1-base1)==0) break; print("base\t=",string.sub(base1.tostring()+" "*30, 0, 30),"\tdiff\t=",diff,"\n"); base1+=diff*0.5; } //print("",base1,"(",math.sqrt(vol),")\n"); return base1; } mysqrt(-1); mysqrt(0.09); mysqrt(2); mysqrt(64); mysqrt(625); mysqrt(1000); mysqrt(9801); mysqrt(1234567890); mysqrt(4294967296); mysqrt("1000000000000000000000000000");