From: Serge Petrenko <sergepetrenko@tarantool.org> To: Chris Sosnin <k.sosnin@tarantool.org> Cc: tarantool-patches@dev.tarantool.org, Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH 2/2] Add IsWhole method for checking the fractional part of a number Date: Mon, 8 Jun 2020 11:59:09 +0300 [thread overview] Message-ID: <e2a58638-9b47-1378-200c-b2b48efc7567@tarantool.org> (raw) In-Reply-To: <48EB02AD-37B7-44AA-BF3C-6FCCF07FA33A@tarantool.org> 07.06.2020 15:40, Chris Sosnin пишет: > Thank you for the review! > >> On 6 Jun 2020, at 17:17, Serge Petrenko <sergepetrenko@tarantool.org> wrote: >> >> 05.06.2020 18:41, Chris Sosnin пишет: >>> Currently there is no efficient way to do this. >>> >>> Needed for tarantool/tarantool#4415 >> Thanks for the patch! >>> --- >>> 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 >>> + >> Consider this diff: >> >> diff --git a/decNumber.c b/decNumber.c >> index f4ad927..acc3fb1 100644 >> --- a/decNumber.c >> +++ b/decNumber.c >> @@ -515,17 +515,14 @@ Flag decNumberIsWhole(const decNumber *dn) { >> } >> if (count==0) return 1; // [a multiple of DECDPUN] >> else { // [not multiple of DECDPUN] >> - Int rem, theInt=0; // work >> + Int rem; // work >> // slice off fraction digits and check for non-zero >> #if DECDPUN<=4 >> - theInt=QUOT10(*up, count); >> - rem=*up-theInt*powers[count]; >> + rem=*up-QUOT10(*up, count)*powers[count]; >> #else >> rem=*up%powers[count]; // slice off discards >> - theInt=*up/powers[count]; >> #endif >> if (rem!=0) return 0; >> - up++; >> } >> } >> return 1; > I agree, looks much better, thanks! > Applied on the branch. Thanks for the fixes! Both patches LGTM. > >>> /* ------------------------------------------------------------------ */ >>> /* 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 *); >> -- >> Serge Petrenko -- Serge Petrenko
next prev parent reply other threads:[~2020-06-08 8:59 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-06-05 15:41 [Tarantool-patches] [PATCH 0/2] update decNumber for SQL Chris Sosnin 2020-06-05 15:41 ` [Tarantool-patches] [PATCH 1/2] Allow leading and trailing whitespaces in FromString Chris Sosnin 2020-06-06 13:48 ` Serge Petrenko 2020-06-07 12:38 ` Chris Sosnin 2020-06-11 17:06 ` Vladislav Shpilevoy 2020-06-11 20:14 ` Chris Sosnin 2020-06-05 15:41 ` [Tarantool-patches] [PATCH 2/2] Add IsWhole method for checking the fractional part of a number Chris Sosnin 2020-06-06 14:17 ` Serge Petrenko 2020-06-07 12:40 ` Chris Sosnin 2020-06-08 8:59 ` Serge Petrenko [this message] 2020-06-11 17:06 ` Vladislav Shpilevoy 2020-06-11 20:30 ` Chris Sosnin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=e2a58638-9b47-1378-200c-b2b48efc7567@tarantool.org \ --to=sergepetrenko@tarantool.org \ --cc=k.sosnin@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 2/2] Add IsWhole method for checking the fractional part of a number' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox