#include <float.h>
// TODO: share with other temps
-static bit sign_bit;
-static data unsigned char expf_y[4];
-static data unsigned char n;
+static __bit sign_bit;
+static __data unsigned char expf_y[4];
+static __data unsigned char n;
float expf(float x)
{
x;
- _asm
+ __asm
mov c, acc.7
mov _sign_bit, c // remember sign
clr acc.7 // and make input positive
mov r3,#0x39
lcall expf_scale_and_add
expf_no_range_reduction:
-
+
// Compute e^x using the cordic algorithm. This works over an
// input range of 0 to 0.69314712. Can be extended to work from
dec sp
expf_done:
clr acc.7 // Result is always positive!
- _endasm;
+ __endasm;
#pragma less_pedantic
}
-
-
-static void dummy1(void) _naked
+static void dummy1(void) __naked
{
- _asm
+ __asm
.globl fs_lshift_a
expf_scale_and_add:
push ar0
dec sp
dec sp
ret
- _endasm;
+ __endasm;
}
-static void dummy(void) _naked
+static void dummy(void) __naked
{
- _asm
+ __asm
.globl fs_lshift_a
fs_lshift_a:
jz fs_lshift_done
pop ar0
fs_lshift_done:
ret
- _endasm;
+ __endasm;
}
-
-
#else // not MATH_ASM_MCS51
-
#define P0 0.2499999995E+0
#define P1 0.4160288626E-2
#define Q0 0.5000000000E+0
#define C1 0.693359375
#define C2 -2.1219444005469058277e-4
-#define BIGX 88.72283911 /* ln(XMAX) */
+#define BIGX 88.72283911 /* ln(HUGE_VALF) */
#define EXPEPS 1.0E-7 /* exp(1.0E-7)=0.0000001 */
#define K1 1.4426950409 /* 1/ln(2) */
if(sign)
{
errno=ERANGE;
- return XMAX;
+ return HUGE_VALF
+ ;
}
else
{
}
#endif
-