do not compile with stack auto, change functions to be nonreentrant, use fixed parameters
- frees up ~4KB of code space
This commit is contained in:
@ -46,6 +46,9 @@ static const uint8_t num_digits_display = 16;
|
||||
__idata dec80 AccDecn, BDecn;
|
||||
|
||||
|
||||
__xdata char Buf[DECN_BUF_SIZE];
|
||||
|
||||
|
||||
void copy_decn(dec80* dest, const dec80* src){
|
||||
uint8_t i;
|
||||
dest->exponent = src->exponent;
|
||||
@ -152,7 +155,7 @@ static void remove_leading_zeros(dec80* x){
|
||||
set_exponent(x, exponent, is_negative);
|
||||
}
|
||||
|
||||
void build_dec80(const char* signif_str, exp_t exponent){
|
||||
void build_dec80(__xdata const char* signif_str, exp_t exponent){
|
||||
enum {
|
||||
SIGN_ZERO,
|
||||
SIGN_ZERO_SEEN_POINT,
|
||||
@ -515,7 +518,6 @@ static void sub_mag(dec80* acc, const dec80* x){
|
||||
_incr_exp(&tmp, get_exponent(acc));
|
||||
}
|
||||
#ifdef DEBUG_ADD
|
||||
extern char Buf[DECN_BUF_SIZE];
|
||||
decn_to_str_complete(Buf, &tmp);
|
||||
printf(" incr_exp tmp: %s\n", Buf);
|
||||
#endif
|
||||
@ -604,7 +606,6 @@ void add_decn(void){
|
||||
remove_leading_zeros(&AccDecn);
|
||||
remove_leading_zeros(&tmp);
|
||||
#ifdef DEBUG_ADD
|
||||
extern char Buf[DECN_BUF_SIZE];
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
printf(" rem_leading_zeros acc: %s\n", Buf);
|
||||
decn_to_str_complete(Buf, &tmp);
|
||||
@ -620,7 +621,6 @@ void add_decn(void){
|
||||
set_exponent(&AccDecn, get_exponent(&tmp), (AccDecn.exponent < 0));
|
||||
}
|
||||
#ifdef DEBUG_ADD
|
||||
extern char Buf[DECN_BUF_SIZE];
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
printf(" incr_exp acc: %s\n", Buf);
|
||||
decn_to_str_complete(Buf, &tmp);
|
||||
@ -788,7 +788,6 @@ void div_decn(void){
|
||||
//do newton raphson iterations
|
||||
for (i = 0; i < DEC80_NUM_LSU; i++){ //just fix number of iterations for now
|
||||
#ifdef DEBUG_DIV
|
||||
extern char Buf[DECN_BUF_SIZE];
|
||||
decn_to_str_complete(Buf, &curr_recip);
|
||||
printf("%2d: %s\n", i, Buf);
|
||||
#endif
|
||||
@ -820,18 +819,17 @@ void div_decn(void){
|
||||
mult_decn();
|
||||
}
|
||||
|
||||
static void set_str_error(char* buf){
|
||||
buf[0] = 'E';
|
||||
buf[1] = 'r';
|
||||
buf[2] = 'r';
|
||||
buf[3] = 'o';
|
||||
buf[4] = 'r';
|
||||
buf[5] = '\0';
|
||||
static void set_str_error(){
|
||||
Buf[0] = 'E';
|
||||
Buf[1] = 'r';
|
||||
Buf[2] = 'r';
|
||||
Buf[3] = 'o';
|
||||
Buf[4] = 'r';
|
||||
Buf[5] = '\0';
|
||||
}
|
||||
|
||||
//buf should hold at least 18 + 4 + 5 + 1 = 28
|
||||
int8_t decn_to_str(char* buf, const dec80* x){
|
||||
#define INSERT_DOT() buf[i++]='.'
|
||||
int8_t decn_to_str(const dec80* x){
|
||||
#define INSERT_DOT() Buf[i++]='.'
|
||||
uint8_t i = 0;
|
||||
uint8_t digit100;
|
||||
exp_t exponent = 0;
|
||||
@ -841,7 +839,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
|
||||
//handle corner case of NaN
|
||||
if (decn_is_nan(x)){
|
||||
set_str_error(buf);
|
||||
set_str_error();
|
||||
#ifdef DEBUG
|
||||
printf (" corner case NaN ");
|
||||
#endif
|
||||
@ -856,8 +854,8 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
#ifdef DEBUG
|
||||
printf (" corner case, set to 0 ");
|
||||
#endif
|
||||
buf[0] = '0';
|
||||
buf[1] = '\0';
|
||||
Buf[0] = '0';
|
||||
Buf[1] = '\0';
|
||||
return 0;
|
||||
}
|
||||
//check sign of number
|
||||
@ -865,7 +863,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
#ifdef DEBUG
|
||||
printf (" negative ");
|
||||
#endif
|
||||
buf[i] = '-';
|
||||
Buf[i] = '-';
|
||||
i++;
|
||||
}
|
||||
//check if we should use scientific notation
|
||||
@ -876,18 +874,18 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
//pad zeros right of decimal point if needed
|
||||
if (!use_sci && exponent < 0){
|
||||
exp_t j;
|
||||
buf[i] = '0';
|
||||
Buf[i] = '0';
|
||||
i++;
|
||||
INSERT_DOT();
|
||||
//pad zeros right of decimal point
|
||||
// for (j = exponent + 1; j < 0; j++){ <--- results in undefined behavior (signed overflow), and causes crash
|
||||
for (j = -exponent -1; j > 0; --j){
|
||||
buf[i] = '0';
|
||||
Buf[i] = '0';
|
||||
i++;
|
||||
}
|
||||
}
|
||||
//print 1st digit
|
||||
buf[i] = (tmp.lsu[0] / 10) + '0';
|
||||
Buf[i] = (tmp.lsu[0] / 10) + '0';
|
||||
i++;
|
||||
if (use_sci) {
|
||||
INSERT_DOT();
|
||||
@ -898,7 +896,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
exponent--;
|
||||
}
|
||||
//print 2nd digit
|
||||
buf[i] = (tmp.lsu[0] % 10) + '0';
|
||||
Buf[i] = (tmp.lsu[0] % 10) + '0';
|
||||
if (tmp.lsu[0] % 10 == 0 && (use_sci || exponent < 0)){
|
||||
|
||||
trailing_zeros = 1;
|
||||
@ -913,7 +911,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
//print rest of significand
|
||||
for (digit100 = 1 ; digit100 < DEC80_NUM_LSU; digit100++){
|
||||
//print 1st digit
|
||||
buf[i] = (tmp.lsu[digit100] / 10) + '0';
|
||||
Buf[i] = (tmp.lsu[digit100] / 10) + '0';
|
||||
i++;
|
||||
if (!use_sci){
|
||||
if (exponent == 0){
|
||||
@ -922,7 +920,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
exponent--;
|
||||
}
|
||||
//print 2nd digit
|
||||
buf[i] = (tmp.lsu[digit100] % 10) + '0';
|
||||
Buf[i] = (tmp.lsu[digit100] % 10) + '0';
|
||||
i++;
|
||||
if (!use_sci){
|
||||
if (exponent == 0){
|
||||
@ -948,7 +946,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
if (use_sci || exponent <= 0){
|
||||
i -= trailing_zeros;
|
||||
}
|
||||
buf[i] = '\0';
|
||||
Buf[i] = '\0';
|
||||
|
||||
//calculate exponent
|
||||
exponent = get_exponent(&tmp); //base 100
|
||||
@ -959,7 +957,7 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
if (use_sci){
|
||||
//check for overflow
|
||||
if (exponent > DEC80_MAX_EXP || exponent < DEC80_MIN_EXP){
|
||||
set_str_error(buf);
|
||||
set_str_error();
|
||||
return 0;
|
||||
}
|
||||
return exponent;
|
||||
@ -978,19 +976,19 @@ int8_t decn_to_str(char* buf, const dec80* x){
|
||||
|
||||
#ifdef DESKTOP
|
||||
//complete string including exponent
|
||||
void decn_to_str_complete(char* buf, const dec80* x){
|
||||
int8_t exponent = decn_to_str(buf, x);
|
||||
void decn_to_str_complete(const dec80* x){
|
||||
int8_t exponent = decn_to_str(x);
|
||||
int i;
|
||||
//find end of string
|
||||
for (i = 0; buf[i] != '\0'; i++);
|
||||
for (i = 0; Buf[i] != '\0'; i++);
|
||||
//add exponent
|
||||
if (exponent != 0){
|
||||
buf[i++] = 'E';
|
||||
Buf[i++] = 'E';
|
||||
if (exponent < 0){
|
||||
buf[i++] = '-';
|
||||
u32str(-exponent, &buf[i], 10); //adds null terminator automatically
|
||||
Buf[i++] = '-';
|
||||
u32str(-exponent, &Buf[i], 10); //adds null terminator automatically
|
||||
} else {
|
||||
u32str(exponent, &buf[i], 10); //adds null terminator automatically
|
||||
u32str(exponent, &Buf[i], 10); //adds null terminator automatically
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ extern "C" {
|
||||
|
||||
#define DEC80_NUM_LSU 9
|
||||
|
||||
//#define EXP16
|
||||
#define EXP16
|
||||
|
||||
#ifdef EXP16
|
||||
typedef int16_t exp_t;
|
||||
@ -53,7 +53,7 @@ exp_t get_exponent(const dec80* x);
|
||||
void copy_decn(dec80* dest, const dec80* src);
|
||||
extern __idata dec80 AccDecn, BDecn;
|
||||
|
||||
void build_dec80(const char* signif_str, exp_t exponent);
|
||||
void build_dec80(__xdata const char* signif_str, exp_t exponent);
|
||||
|
||||
void set_dec80_zero(dec80* dest);
|
||||
void set_dec80_NaN(dec80* dest);
|
||||
@ -64,13 +64,14 @@ void add_decn(void);
|
||||
void mult_decn(void);
|
||||
void div_decn(void);
|
||||
|
||||
//buf should hold at least 18 + 4 + 5 + 1 = 28
|
||||
//Buf should hold at least 18 + 4 + 5 + 1 = 28
|
||||
#define DECN_BUF_SIZE 28
|
||||
int8_t decn_to_str(char* buf, const dec80* x);
|
||||
extern __xdata char Buf[DECN_BUF_SIZE];
|
||||
int8_t decn_to_str(const dec80* x);
|
||||
|
||||
#ifdef DESKTOP
|
||||
//complete string including exponent
|
||||
void decn_to_str_complete(char* buf, const dec80* x);
|
||||
void decn_to_str_complete(const dec80* x);
|
||||
void build_decn_at(dec80* dest, const char* signif_str, exp_t exponent);
|
||||
#endif
|
||||
|
||||
|
@ -32,17 +32,17 @@ static void div_test(
|
||||
{
|
||||
build_dec80(a_str, a_exp);
|
||||
build_decn_at(&BDecn, b_str, b_exp);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf(" acc: %s\n", Buf);
|
||||
decn_to_str_complete(Buf, &BDecn);
|
||||
decn_to_str_complete(&BDecn);
|
||||
printf(" b: %s\n", Buf);
|
||||
div_decn();
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("acc/b: %s\n", Buf);
|
||||
printf(" : %s\n", res_str);
|
||||
build_decn_at(&diff, res_calc, res_exp);
|
||||
take_diff();
|
||||
decn_to_str_complete(Buf, &diff);
|
||||
decn_to_str_complete(&diff);
|
||||
printf(" : %s\n\n", Buf);
|
||||
}
|
||||
|
||||
@ -50,15 +50,15 @@ int main(void){
|
||||
// dec80 acc, b;
|
||||
|
||||
build_dec80("0.0009234567890123456", 7);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf(" acc: %s\n", Buf);
|
||||
|
||||
build_dec80("9.234567890123456", 3);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf(" acc: %s\n", Buf);
|
||||
|
||||
negate_decn(&AccDecn);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("-acc: %s\n", Buf);
|
||||
|
||||
dec80 tmp_copy;
|
||||
@ -66,54 +66,54 @@ int main(void){
|
||||
build_dec80("-92.3456789012345678", 1);
|
||||
copy_decn(&BDecn, &AccDecn);
|
||||
copy_decn(&AccDecn, &tmp_copy); //restore
|
||||
decn_to_str_complete(Buf, &BDecn);
|
||||
decn_to_str_complete(&BDecn);
|
||||
printf(" b: %s\n", Buf);
|
||||
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("-acc: %s\n", Buf);
|
||||
|
||||
//compare result of b - acc
|
||||
add_decn();
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("b - a: %s\n", Buf);
|
||||
printf(" : %s\n", "-10158.0246791358016");
|
||||
build_decn_at(&diff, "-1.01580246791358016", 4);
|
||||
take_diff();
|
||||
decn_to_str_complete(Buf, &diff);
|
||||
decn_to_str_complete(&diff);
|
||||
printf(" : %s\n\n", Buf);
|
||||
|
||||
//new acc for acc - b test
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("acc: %s\n", Buf);
|
||||
negate_decn(&BDecn);
|
||||
decn_to_str_complete(Buf, &BDecn);
|
||||
decn_to_str_complete(&BDecn);
|
||||
printf(" -b: %s\n", Buf);
|
||||
|
||||
add_decn();
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
//compare result of new acc - b
|
||||
printf("acc - b: %s\n", Buf);
|
||||
printf(" : %s\n", "-9234.567890123456");
|
||||
build_decn_at(&diff, "-9.234567890123456", 3);
|
||||
take_diff();
|
||||
decn_to_str_complete(Buf, &diff);
|
||||
decn_to_str_complete(&diff);
|
||||
printf(" : %s\n\n", Buf);
|
||||
|
||||
//new acc and b for multiply test
|
||||
// build_dec80("7", 2);
|
||||
build_dec80("92.34567890123456", 2);
|
||||
build_decn_at(&BDecn, "-92.3456789012345678", 1);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf(" acc: %s\n", Buf);
|
||||
decn_to_str_complete(Buf, &BDecn);
|
||||
decn_to_str_complete(&BDecn);
|
||||
printf(" b: %s\n", Buf);
|
||||
mult_decn();
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("acc*b: %s\n", Buf);
|
||||
printf(" : %s\n", "-8527724.41172991849");
|
||||
build_decn_at(&diff, "-8.52772441172991849", 6);
|
||||
take_diff();
|
||||
decn_to_str_complete(Buf, &diff);
|
||||
decn_to_str_complete(&diff);
|
||||
printf(" : %s\n\n", Buf);
|
||||
|
||||
//new acc and b for divide test
|
||||
@ -143,13 +143,13 @@ int main(void){
|
||||
//small fractions >= 1/10
|
||||
build_dec80("0.333", 0);
|
||||
build_decn_at(&BDecn, "3.33", -1);
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf(" a : %s\n", Buf);
|
||||
decn_to_str_complete(Buf, &BDecn);
|
||||
decn_to_str_complete(&BDecn);
|
||||
printf(" b : %s\n", Buf);
|
||||
negate_decn(&BDecn);
|
||||
add_decn();
|
||||
decn_to_str_complete(Buf, &AccDecn);
|
||||
decn_to_str_complete(&AccDecn);
|
||||
printf("a - b: %s\n", Buf);
|
||||
|
||||
//new acc and b for divide test
|
||||
|
Reference in New Issue
Block a user