bugfixes for multiply
This commit is contained in:
parent
0ba2ca7710
commit
116b6ed2e6
@ -597,24 +597,24 @@ void mult_decn(dec80* acc, const dec80* x){
|
|||||||
int8_t i, j;
|
int8_t i, j;
|
||||||
uint8_t carry = 0;
|
uint8_t carry = 0;
|
||||||
uint8_t is_neg;
|
uint8_t is_neg;
|
||||||
|
int16_t new_exponent;
|
||||||
//initialize values
|
//initialize values
|
||||||
copy_decn(&tmp, x);
|
copy_decn(&tmp, x);
|
||||||
set_dec80_zero(&acc_tmp);
|
set_dec80_zero(&acc_tmp);
|
||||||
//normalize
|
//normalize
|
||||||
remove_leading_zeros(acc);
|
remove_leading_zeros(acc);
|
||||||
remove_leading_zeros(&tmp);
|
remove_leading_zeros(&tmp);
|
||||||
//calculate new exponent
|
//store new sign
|
||||||
if ((acc->exponent & 0x8000) ^ (tmp.exponent & 0x8000)){ //signs differ
|
if ((acc->exponent & 0x8000) ^ (tmp.exponent & 0x8000)){ //signs differ
|
||||||
is_neg = 1;
|
is_neg = 1;
|
||||||
} else {
|
} else {
|
||||||
is_neg = 0;
|
is_neg = 0;
|
||||||
}
|
}
|
||||||
acc_tmp.exponent = get_exponent(acc) + get_exponent(&tmp);
|
//calculate new exponent
|
||||||
if (is_neg){
|
new_exponent = get_exponent(acc) + get_exponent(&tmp);
|
||||||
acc_tmp.exponent |= 0x8000;
|
#ifdef DEBUG_MULT
|
||||||
} else {
|
printf("\n new exponent: %d:", new_exponent);
|
||||||
acc_tmp.exponent &= 0x7fff;
|
#endif
|
||||||
}
|
|
||||||
//do multiply
|
//do multiply
|
||||||
for (i = DEC80_NUM_LSU - 1; i >= 0; i--){
|
for (i = DEC80_NUM_LSU - 1; i >= 0; i--){
|
||||||
//partial product
|
//partial product
|
||||||
@ -643,14 +643,35 @@ void mult_decn(dec80* acc, const dec80* x){
|
|||||||
}
|
}
|
||||||
printf("\ncarry:%d", carry);
|
printf("\ncarry:%d", carry);
|
||||||
#endif
|
#endif
|
||||||
|
if (i != 0){ //handle last carry separately later, no final shift
|
||||||
//shift
|
//shift
|
||||||
shift_right(&acc_tmp);
|
shift_right(&acc_tmp);
|
||||||
shift_right(&acc_tmp);
|
shift_right(&acc_tmp);
|
||||||
//add back carry to MSdigit100
|
//add back carry to MSdigit100
|
||||||
acc_tmp.lsu[0] = carry; //was 0 from shift
|
acc_tmp.lsu[0] = carry; //was 0 from shift
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
//handle last carry
|
||||||
|
if (carry > 10){
|
||||||
|
//shift
|
||||||
|
shift_right(&acc_tmp);
|
||||||
|
shift_right(&acc_tmp);
|
||||||
|
new_exponent += 1;
|
||||||
|
//add back carry to MSdigit100
|
||||||
|
acc_tmp.lsu[0] = carry; //was 0 from shift
|
||||||
|
} else if (carry > 0){
|
||||||
|
//shift
|
||||||
|
shift_right(&acc_tmp);
|
||||||
|
//add back carry to MSdigit in MSdigit100
|
||||||
|
acc_tmp.lsu[0] += carry*10;
|
||||||
|
}
|
||||||
|
//set new exponent
|
||||||
|
set_exponent(&acc_tmp, new_exponent, is_neg);
|
||||||
//copy back to acc
|
//copy back to acc
|
||||||
copy_decn(acc, &acc_tmp);
|
copy_decn(acc, &acc_tmp);
|
||||||
|
//normalize
|
||||||
|
remove_leading_zeros(acc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//buf should hold at least 18 + 4 + 5 + 1 = 28
|
//buf should hold at least 18 + 4 + 5 + 1 = 28
|
||||||
|
@ -61,6 +61,17 @@ int main(void){
|
|||||||
dec80_to_str(buf, &diff);
|
dec80_to_str(buf, &diff);
|
||||||
printf("\n : %s\n\n", buf);
|
printf("\n : %s\n\n", buf);
|
||||||
|
|
||||||
|
//new acc and b for multiply test
|
||||||
|
// build_dec80(&acc, "2", 2);
|
||||||
|
build_dec80(&acc, "92.34567890123456", 2);
|
||||||
|
build_dec80(&b, "-92.3456789012345678", 1);
|
||||||
|
dec80_to_str(buf, &acc);
|
||||||
|
printf(" acc: %s\n", buf);
|
||||||
|
dec80_to_str(buf, &b);
|
||||||
|
printf(" b: %s\n", buf);
|
||||||
|
mult_decn(&acc, &b);
|
||||||
|
dec80_to_str(buf, &acc);
|
||||||
|
printf("acc*b: %s\n\n", buf);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user