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 <f16.h>
00024 #include <s16_to_f16.h>
00025
00026
00027 #define NEXT(n, i) (((n) + (i)/(n)) >> 1)
00028
00029 static uint16_t u16_sqrt(uint16_t number) {
00030 uint16_t n = 1;
00031 uint16_t n1 = NEXT(n, number);
00032
00033 if (number == 0)
00034 return 0;
00035
00036 while(ABS(n1 - n) > 1) {
00037 n = n1;
00038 n1 = NEXT(n, number);
00039 }
00040 while((n1*n1) > number) {
00041 n1 -= 1;
00042 }
00043 return n1;
00044 }
00045
00046
00047 f16 f16_sqrt(f16 f)
00048 {
00049 uint16_t a,b,c,d;
00050
00051 if (F16_IS_NEG(f))
00052 return F16_NAN;
00053
00054 if(f.f16_integer) {
00055
00056 a=(uint16_t)(f.f16_integer) << 8 ;
00057 b=(uint16_t)(f.f16_decimal) << 8 ;
00058 c=u16_sqrt(a);
00059 d=u16_sqrt(0x100 + (b/a));
00060 return f16_mul(s16_to_f16( c<<4 ), s16_to_f16( d<<4 ));
00061 }
00062 else {
00063 b=(uint16_t)(f.f16_decimal) << 8 ;
00064 return s16_to_f16(u16_sqrt(b));
00065 }
00066 }