From 3930f5cd02067b352c673660dd735234458ee002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZIGETI=20J=C3=A1nos?= Date: Tue, 30 Jan 2024 15:10:41 +0100 Subject: [PATCH] [ISSUE-0090]: bigdecimal absv function --- src/bigdecimal128.c | 5 +++++ src/bigdecimal128.h | 1 + src/biguint128.c | 4 ++++ src/biguint128.h | 1 + tests/bigdecimal128_pval_test.c | 15 +++++++++++++++ 5 files changed, 26 insertions(+) diff --git a/src/bigdecimal128.c b/src/bigdecimal128.c index 59b5bee..cc287f5 100644 --- a/src/bigdecimal128.c +++ b/src/bigdecimal128.c @@ -433,6 +433,11 @@ BigDecimal128 bigdecimal128_mulv(const BigDecimal128 a, const BigDecimal128 b) { BigDecimal128 bigdecimal128_divv(const BigDecimal128 a, const BigDecimal128 b, UInt prec) { return bigdecimal128_div(&a, &b, prec); } + +BigDecimal128 bigdecimal128_absv(const BigDecimal128 a, buint_bool *result_inv) { + return (BigDecimal128){bigint128_absv(a.val, result_inv), a.prec}; +} + buint_bool bigdecimal128_ltv(const BigDecimal128 a, const BigDecimal128 b) { return bigdecimal128_lt(&a, &b); } diff --git a/src/bigdecimal128.h b/src/bigdecimal128.h index 3b075bd..08618c2 100644 --- a/src/bigdecimal128.h +++ b/src/bigdecimal128.h @@ -130,6 +130,7 @@ BigDecimal128 bigdecimal128_addv(const BigDecimal128 a, const BigDecimal128 b); BigDecimal128 bigdecimal128_subv(const BigDecimal128 a, const BigDecimal128 b); BigDecimal128 bigdecimal128_mulv(const BigDecimal128 a, const BigDecimal128 b); BigDecimal128 bigdecimal128_divv(const BigDecimal128 a, const BigDecimal128 b, UInt prec); +BigDecimal128 bigdecimal128_absv(const BigDecimal128 a, buint_bool *result_inv); buint_bool bigdecimal128_ltv(const BigDecimal128 a, const BigDecimal128 b); buint_bool bigdecimal128_eqv(const BigDecimal128 a, const BigDecimal128 b); buint_size_t bigdecimal128_printv(const BigDecimal128 a, char *buf, buint_size_t buf_len); diff --git a/src/biguint128.c b/src/biguint128.c index 6e73434..12880a9 100644 --- a/src/biguint128.c +++ b/src/biguint128.c @@ -1057,6 +1057,10 @@ BigUIntPair128 bigint128_divv(const BigUInt128 a, const BigUInt128 b) { return bigint128_div(&a, &b); } +BigUInt128 bigint128_absv(const BigUInt128 a, buint_bool *b) { + return bigint128_abs(&a, b); +} + BigUInt128 biguint128_andv(const BigUInt128 a, const BigUInt128 b) { return biguint128_and(&a, &b); } diff --git a/src/biguint128.h b/src/biguint128.h index 3b11bce..5f25c2c 100644 --- a/src/biguint128.h +++ b/src/biguint128.h @@ -376,6 +376,7 @@ BigUInt128 biguint128_subv(const BigUInt128 a, const BigUInt128 b); BigUInt128 biguint128_mulv(const BigUInt128 a, const BigUInt128 b); BigUIntPair128 biguint128_divv(const BigUInt128 a, const BigUInt128 b); BigUIntPair128 bigint128_divv(const BigUInt128 a, const BigUInt128 b); +BigUInt128 bigint128_absv(const BigUInt128 a, buint_bool *b); BigUInt128 biguint128_andv(const BigUInt128 a, const BigUInt128 b); BigUInt128 biguint128_orv(const BigUInt128 a, const BigUInt128 b); diff --git a/tests/bigdecimal128_pval_test.c b/tests/bigdecimal128_pval_test.c index b86a218..192c504 100644 --- a/tests/bigdecimal128_pval_test.c +++ b/tests/bigdecimal128_pval_test.c @@ -109,6 +109,21 @@ static bool compare_all() { pass = false; } } + { // bigint abs + buint_bool expected_inv, actual_inv[2]; + BigDecimal128 expected = {bigint128_abs(&a.val, &expected_inv),a.prec}; + BigDecimal128 actual[] = { + {bigint128_absv(a.val, &actual_inv[0]),a.prec}, + bigdecimal128_absv(a, &actual_inv[1]) + }; + for (unsigned int j=0; j<2; ++j) { + pass &= compare_result_(stderr, "biguint abs function", &expected, &actual[j], i, j); + if (!!expected_inv != !!actual_inv[j]) { + fprintf(stderr, "pass-by-value result error at sample #%u, abs#%u result_inv\n", i, j); + pass = false; + } + } + } } return pass; }