#include #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; }) #define SQRT(n)\ ({\ __builtin_choose_expr((__typeof__(n))1.5 != 1, sqrtl(fabsl(n)),\ __builtin_choose_expr((__typeof__(n))-1 < 0, ISQRT((intmax_t)n),\ ISQRT((uintmax_t)n)));\ }) extern long double sqrtl(long double); extern long double fabsl(long double); int main(int argc, char *argv[]){ for(int i = 1; i < argc; ++i){ intmax_t n = strtoimax(argv[i], NULL, 0); long double f = strtold(argv[i], NULL); printf("isqrt(%jd) == %jd%s\n", n, SQRT(n), n < 0 ? "i" : ""); printf("sqrt(%Lf) == %Lf%s\n", f, SQRT(f), f < 0 ? "i" : ""); } return 0; }