#include #include #include #include #define ISQRT(n)\ ({ __typeof__(n) r = 0, _n = (n), i = 1;\ i = i << ((sizeof(i) * CHAR_BIT - (0 > ~i ? 2 : 1)) / 2) * 2;\ if(0 > _n) _n = -_n;\ for(; i; i >>= 2)\ if(_n >= (i | r)){\ _n -= i | r;\ r = r >> 1 | i;\ } else r >>= 1;\ r; }) int main(int argc, char *argv[]){ for(int i = 1; i < argc; ++i){ intmax_t n = strtoimax(argv[i], NULL, 0); printf("isqrt(%jd) == %jd%s\n", n, ISQRT(n), n < 0 ? "i" : ""); } return 0; }