struct fp_ext * fp_fcosh(struct fp_ext *dest, struct fp_ext *src) { uprint("fcosh\n"); fp_monadic_check(dest, src); return dest; }
struct fp_ext * fp_flog2(struct fp_ext *dest, struct fp_ext *src) { uprint("flog2\n"); fp_monadic_check(dest, src); return dest; }
struct fp_ext * fp_fatan(struct fp_ext *dest, struct fp_ext *src) { uprint("fatan\n"); fp_monadic_check(dest, src); return dest; }
struct fp_ext * fp_ftentox(struct fp_ext *dest, struct fp_ext *src) { uprint("ftentox\n"); fp_monadic_check(dest, src); return dest; }
struct fp_ext * fp_fetoxm1(struct fp_ext *dest, struct fp_ext *src) { uprint("fetoxm1\n"); fp_monadic_check(dest, src); return dest; }
struct fp_ext * fp_fneg(struct fp_ext *dest, struct fp_ext *src) { dprint(PINSTR, "fneg\n"); fp_monadic_check(dest, src); dest->sign = !dest->sign; return dest; }
struct fp_ext * fp_fabs(struct fp_ext *dest, struct fp_ext *src) { dprint(PINSTR, "fabs\n"); fp_monadic_check(dest, src); dest->sign = 0; return dest; }
struct fp_ext * fp_fgetman(struct fp_ext *dest, struct fp_ext *src) { dprint(PINSTR, "fgetman\n"); fp_monadic_check(dest, src); if (IS_ZERO(dest)) return dest; if (IS_INF(dest)) return dest; dest->exp = 0x3FFF; return dest; }
struct fp_ext * fp_fgetexp(struct fp_ext *dest, struct fp_ext *src) { dprint(PINSTR, "fgetexp\n"); fp_monadic_check(dest, src); if (IS_INF(dest)) { fp_set_nan(dest); return dest; } if (IS_ZERO(dest)) return dest; fp_conv_long2ext(dest, (int)dest->exp - 0x3FFF); fp_normalize_ext(dest); return dest; }
struct fp_ext * fp_fsqrt(struct fp_ext *dest, struct fp_ext *src) { struct fp_ext tmp, src2; int i, exp; dprint(PINSTR, "fsqrt\n"); fp_monadic_check(dest, src); if (IS_ZERO(dest)) return dest; if (dest->sign) { fp_set_nan(dest); return dest; } if (IS_INF(dest)) return dest; /* * sqrt(m) * 2^(p) , if e = 2*p * sqrt(m*2^e) = * sqrt(2*m) * 2^(p) , if e = 2*p + 1 * * So we use the last bit of the exponent to decide wether to * use the m or 2*m. * * Since only the fractional part of the mantissa is stored and * the integer part is assumed to be one, we place a 1 or 2 into * the fixed point representation. */ exp = dest->exp; dest->exp = 0x3FFF; if (!(exp & 1)) /* lowest bit of exponent is set */ dest->exp++; fp_copy_ext(&src2, dest); /* * The taylor row around a for sqrt(x) is: * sqrt(x) = sqrt(a) + 1/(2*sqrt(a))*(x-a) + R * With a=1 this gives: * sqrt(x) = 1 + 1/2*(x-1) * = 1/2*(1+x) */ fp_fadd(dest, &fp_one); dest->exp--; /* * 1/2 */ /* * We now apply the newton rule to the function * f(x) := x^2 - r * which has a null point on x = sqrt(r). * * It gives: * x' := x - f(x)/f'(x) * = x - (x^2 -r)/(2*x) * = x - (x - r/x)/2 * = (2*x - x + r/x)/2 * = (x + r/x)/2 */ for (i = 0; i < 9; i++) { fp_copy_ext(&tmp, &src2); fp_fdiv(&tmp, dest); fp_fadd(dest, &tmp); dest->exp--; } dest->exp += (exp - 0x3FFF) / 2; return dest; }