[Tarantool-patches] [PATCH 2/2] Add IsWhole method for checking the fractional part of a number
Chris Sosnin
k.sosnin at tarantool.org
Fri Jun 5 18:41:13 MSK 2020
Currently there is no efficient way to do this.
Needed for tarantool/tarantool#4415
---
decNumber.c | 30 ++++++++++++++++++++++++++++++
decNumber.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/decNumber.c b/decNumber.c
index 7c53bc3..f4ad927 100644
--- a/decNumber.c
+++ b/decNumber.c
@@ -501,6 +501,36 @@ uLong decNumberToUInt64(const decNumber *dn, decContext *set) {
return 0;
} // decNumberToUInt64
+Flag decNumberIsWhole(const decNumber *dn) {
+ const Unit *up=dn->lsu;
+ if (dn->exponent>=0) {
+ return 1;
+ }
+ else {
+ Int count=-dn->exponent;
+ // spin up whole units until reach the Unit with the unit digit
+ for (; count>=DECDPUN; up++) {
+ if (*up!=0) return 0;
+ count-=DECDPUN;
+ }
+ if (count==0) return 1; // [a multiple of DECDPUN]
+ else { // [not multiple of DECDPUN]
+ Int rem, theInt=0; // work
+ // slice off fraction digits and check for non-zero
+ #if DECDPUN<=4
+ theInt=QUOT10(*up, count);
+ rem=*up-theInt*powers[count];
+ #else
+ rem=*up%powers[count]; // slice off discards
+ theInt=*up/powers[count];
+ #endif
+ if (rem!=0) return 0;
+ up++;
+ }
+ }
+ return 1;
+ } // decNumberIsWhole
+
/* ------------------------------------------------------------------ */
/* to-scientific-string -- conversion to numeric string */
/* to-engineering-string -- conversion to numeric string */
diff --git a/decNumber.h b/decNumber.h
index 85a3f3f..71ab27f 100644
--- a/decNumber.h
+++ b/decNumber.h
@@ -169,6 +169,7 @@
decNumber * decNumberTrim(decNumber *);
const char * decNumberVersion(void);
decNumber * decNumberZero(decNumber *);
+ uint8_t decNumberIsWhole(const decNumber *dn);
/* Functions for testing decNumbers (normality depends on context) */
int32_t decNumberIsNormal(const decNumber *, decContext *);
--
2.21.1 (Apple Git-122.3)
More information about the Tarantool-patches
mailing list