fix reciprocol convergence
This commit is contained in:
parent
0278165339
commit
1be980d85b
@ -478,7 +478,7 @@ static void sub_mag(dec80* acc, const dec80* x){
|
|||||||
}
|
}
|
||||||
#ifdef DEBUG_ADD
|
#ifdef DEBUG_ADD
|
||||||
extern char Buf[DECN_BUF_SIZE];
|
extern char Buf[DECN_BUF_SIZE];
|
||||||
dec80_to_str(buf, &tmp);
|
decn_to_str_complete(buf, &tmp);
|
||||||
printf(" incr_exp tmp: %s\n", buf);
|
printf(" incr_exp tmp: %s\n", buf);
|
||||||
#endif
|
#endif
|
||||||
//do subtraction
|
//do subtraction
|
||||||
@ -567,9 +567,9 @@ void add_decn(dec80* acc, const dec80* x){
|
|||||||
remove_leading_zeros(&tmp);
|
remove_leading_zeros(&tmp);
|
||||||
#ifdef DEBUG_ADD
|
#ifdef DEBUG_ADD
|
||||||
extern char Buf[DECN_BUF_SIZE];
|
extern char Buf[DECN_BUF_SIZE];
|
||||||
dec80_to_str(buf, acc);
|
decn_to_str_complete(buf, acc);
|
||||||
printf(" rem_leading_zeros acc: %s\n", buf);
|
printf(" rem_leading_zeros acc: %s\n", buf);
|
||||||
dec80_to_str(buf, &tmp);
|
decn_to_str_complete(buf, &tmp);
|
||||||
printf(" rem_leading_zeros tmp: %s\n", buf);
|
printf(" rem_leading_zeros tmp: %s\n", buf);
|
||||||
#endif
|
#endif
|
||||||
if (get_exponent(acc) > get_exponent(&tmp)){
|
if (get_exponent(acc) > get_exponent(&tmp)){
|
||||||
@ -583,9 +583,9 @@ void add_decn(dec80* acc, const dec80* x){
|
|||||||
}
|
}
|
||||||
#ifdef DEBUG_ADD
|
#ifdef DEBUG_ADD
|
||||||
extern char Buf[DECN_BUF_SIZE];
|
extern char Buf[DECN_BUF_SIZE];
|
||||||
dec80_to_str(buf, acc);
|
decn_to_str_complete(buf, acc);
|
||||||
printf(" incr_exp acc: %s\n", buf);
|
printf(" incr_exp acc: %s\n", buf);
|
||||||
dec80_to_str(buf, &tmp);
|
decn_to_str_complete(buf, &tmp);
|
||||||
printf(" incr_exp tmp: %s\n", buf);
|
printf(" incr_exp tmp: %s\n", buf);
|
||||||
#endif
|
#endif
|
||||||
//do addition
|
//do addition
|
||||||
@ -721,12 +721,8 @@ void div_decn(dec80* acc, const dec80* x){
|
|||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
printf("exponent %d", initial_exp);
|
printf("exponent %d", initial_exp);
|
||||||
#endif
|
#endif
|
||||||
if (initial_exp >= 0){
|
//necessary to subtract 1 for convergence
|
||||||
//necessary to subtract 1 for convergence
|
initial_exp = -initial_exp - 1;
|
||||||
initial_exp = -initial_exp - 1;
|
|
||||||
} else {
|
|
||||||
initial_exp = -initial_exp;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
printf(" -> %d\n", initial_exp);
|
printf(" -> %d\n", initial_exp);
|
||||||
#endif
|
#endif
|
||||||
@ -740,23 +736,23 @@ void div_decn(dec80* acc, const dec80* x){
|
|||||||
for (i = 0; i < DEC80_NUM_LSU + 4; i++){ //just fix number of iterations for now
|
for (i = 0; i < DEC80_NUM_LSU + 4; i++){ //just fix number of iterations for now
|
||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
extern char Buf[80];
|
extern char Buf[80];
|
||||||
dec80_to_str(Buf, &tmp);
|
decn_to_str_complete(Buf, &tmp);
|
||||||
printf("%2d: %s\n", i, Buf);
|
printf("%2d: %s\n", i, Buf);
|
||||||
#endif
|
#endif
|
||||||
mult_decn(acc, x);
|
mult_decn(acc, x);
|
||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
dec80_to_str(Buf, acc);
|
decn_to_str_complete(Buf, acc);
|
||||||
printf(" %20s: %s\n", "recip*x", Buf);
|
printf(" %20s: %s\n", "recip*x", Buf);
|
||||||
#endif
|
#endif
|
||||||
negate_decn(acc);
|
negate_decn(acc);
|
||||||
add_decn(acc, &DECN_1);
|
add_decn(acc, &DECN_1);
|
||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
dec80_to_str(Buf, acc);
|
decn_to_str_complete(Buf, acc);
|
||||||
printf(" %20s: %s\n", "(1-recip*x)", Buf);
|
printf(" %20s: %s\n", "(1-recip*x)", Buf);
|
||||||
#endif
|
#endif
|
||||||
mult_decn(acc, &tmp);
|
mult_decn(acc, &tmp);
|
||||||
#ifdef DEBUG_DIV
|
#ifdef DEBUG_DIV
|
||||||
dec80_to_str(Buf, acc);
|
decn_to_str_complete(Buf, acc);
|
||||||
printf(" %20s: %s\n", "recip * (1-recip*x)", Buf);
|
printf(" %20s: %s\n", "recip * (1-recip*x)", Buf);
|
||||||
#endif
|
#endif
|
||||||
add_decn(acc, &tmp);
|
add_decn(acc, &tmp);
|
||||||
|
@ -178,6 +178,23 @@ int main(void){
|
|||||||
decn_to_str_complete(Buf, &diff);
|
decn_to_str_complete(Buf, &diff);
|
||||||
printf(" : %s\n\n", Buf);
|
printf(" : %s\n\n", Buf);
|
||||||
|
|
||||||
|
//new acc and b for divide test
|
||||||
|
build_dec80(&acc, "3", 0);
|
||||||
|
build_dec80(&b, "25", -15);
|
||||||
|
decn_to_str_complete(Buf, &acc);
|
||||||
|
printf(" acc: %s\n", Buf);
|
||||||
|
decn_to_str_complete(Buf, &b);
|
||||||
|
printf(" b: %s\n", Buf);
|
||||||
|
div_decn(&acc, &b);
|
||||||
|
decn_to_str_complete(Buf, &acc);
|
||||||
|
printf("acc/b: %s\n", Buf);
|
||||||
|
printf(" : %s\n", "120000000000000");
|
||||||
|
build_dec80(&diff, "1.2", 14);
|
||||||
|
negate_decn(&diff);
|
||||||
|
add_decn(&diff, &acc);
|
||||||
|
decn_to_str_complete(Buf, &diff);
|
||||||
|
printf(" : %s\n\n", Buf);
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2,13 +2,15 @@
|
|||||||
// STC15 RPN calculator
|
// STC15 RPN calculator
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "stc15.h"
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
#include "decn/decn.h"
|
#include "decn/decn.h"
|
||||||
#include "calc.h"
|
#include "calc.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#ifndef DESKTOP
|
||||||
|
#include "stc15.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FOSC 11583000
|
#define FOSC 11583000
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user