handle special cases for power function
This commit is contained in:
parent
5ea2818fe3
commit
c18c0dabfd
@ -1219,6 +1219,14 @@ inline void exp10_decn(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void pow_decn(void) {
|
inline void pow_decn(void) {
|
||||||
|
if (decn_is_zero(&BDecn)) {
|
||||||
|
copy_decn(&AccDecn, &DECN_1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (decn_is_zero(&AccDecn)) {
|
||||||
|
set_dec80_zero(&AccDecn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
//calculate AccDecn = AccDecn ^ BDecn
|
//calculate AccDecn = AccDecn ^ BDecn
|
||||||
copy_decn(&Tmp4Decn, &BDecn); //save b
|
copy_decn(&Tmp4Decn, &BDecn); //save b
|
||||||
ln_decn();
|
ln_decn();
|
||||||
|
@ -466,12 +466,10 @@ static void pow_test(
|
|||||||
CAPTURE(b_str); CAPTURE(b_exp);
|
CAPTURE(b_str); CAPTURE(b_exp);
|
||||||
|
|
||||||
//compute power
|
//compute power
|
||||||
log_test(a_str, a_exp);
|
|
||||||
build_decn_at(&BDecn, b_str, b_exp);
|
build_decn_at(&BDecn, b_str, b_exp);
|
||||||
mult_decn();
|
build_dec80(a_str, a_exp);
|
||||||
int8_t exp_test_exp = decn_to_str(&AccDecn);
|
|
||||||
std::string copied(Buf);
|
pow_decn();
|
||||||
exp_test(copied.c_str(), exp_test_exp, 6e-15);
|
|
||||||
|
|
||||||
decn_to_str_complete(&AccDecn);
|
decn_to_str_complete(&AccDecn);
|
||||||
CAPTURE(Buf); // a^b
|
CAPTURE(Buf); // a^b
|
||||||
@ -487,10 +485,15 @@ static void pow_test(
|
|||||||
// CAPTURE(b_full_str);
|
// CAPTURE(b_full_str);
|
||||||
bmp::mpfr_float a_actual(a_full_str);
|
bmp::mpfr_float a_actual(a_full_str);
|
||||||
bmp::mpfr_float b_actual(b_full_str);
|
bmp::mpfr_float b_actual(b_full_str);
|
||||||
a_actual = exp(log(a_actual) * b_actual);
|
a_actual = pow(a_actual, b_actual);
|
||||||
|
if (decn_is_zero(&AccDecn)) {
|
||||||
|
bmp::mpfr_float diff = abs(a_actual - calculated);
|
||||||
|
CHECK(diff < 3e-14);
|
||||||
|
} else {
|
||||||
bmp::mpfr_float rel_diff = abs((a_actual - calculated)/a_actual);
|
bmp::mpfr_float rel_diff = abs((a_actual - calculated)/a_actual);
|
||||||
CHECK(rel_diff < 3e-14);
|
CHECK(rel_diff < 3e-14);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("power"){
|
TEST_CASE("power"){
|
||||||
pow_test(
|
pow_test(
|
||||||
@ -502,6 +505,26 @@ TEST_CASE("power"){
|
|||||||
"3", 0,
|
"3", 0,
|
||||||
"201", 0
|
"201", 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pow_test(
|
||||||
|
"5", 0,
|
||||||
|
"0", 0
|
||||||
|
);
|
||||||
|
|
||||||
|
pow_test(
|
||||||
|
"5", 0,
|
||||||
|
"0", 2
|
||||||
|
);
|
||||||
|
|
||||||
|
pow_test(
|
||||||
|
"0", 0,
|
||||||
|
"5", 0
|
||||||
|
);
|
||||||
|
|
||||||
|
pow_test(
|
||||||
|
"0", 0,
|
||||||
|
"0", 0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("u32str corner"){
|
TEST_CASE("u32str corner"){
|
||||||
|
Loading…
Reference in New Issue
Block a user