00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <f64.h>
00024 #include <s64_to_f64.h>
00025
00026 #define NEXT(n, i) (((n) + (i)/(n)) >> 1)
00027
00028 static uint64_t u64_sqrt(uint64_t number) {
00029 uint64_t n = 1;
00030 uint64_t n1 = NEXT(n, number);
00031
00032 if (number == 0)
00033 return 0;
00034
00035 while(ABS(n1 - n) > 1) {
00036 n = n1;
00037 n1 = NEXT(n, number);
00038 }
00039 while((n1*n1) > number) {
00040 n1 -= 1;
00041 }
00042 return n1;
00043 }
00044
00045 f64 f64_sqrt(f64 f)
00046 {
00047 uint64_t a,b,c,d;
00048
00049 if (F64_IS_ZERO(f))
00050 return F64_ZERO;
00051
00052 if (F64_IS_NEG(f))
00053 return F64_NAN;
00054
00055 if(f.f64_integer) {
00056
00057 a=(uint64_t)(f.f64_integer) << 32 ;
00058 b=(uint64_t)(f.f64_decimal) << 32 ;
00059 c=u64_sqrt(a);
00060 d=u64_sqrt(0x100000000 + (b/a));
00061 return f64_mul(s64_to_f64( c<<16 ), s64_to_f64( d<<16 ));
00062 }
00063 else {
00064 b=(uint64_t)(f.f64_decimal) << 32 ;
00065 return s64_to_f64(u64_sqrt(b));
00066 }
00067 }