zsh-workers
 help / color / mirror / code / Atom feed
From: Joey Pabalinas <joeypabalinas@gmail.com>
To: dana <dana@dana.is>
Cc: Zsh workers <zsh-workers@zsh.org>,
	Joey Pabalinas <joeypabalinas@gmail.com>
Subject: Re: [PATCH] ztrftime(): Fix truncation for %.
Date: Mon, 24 Dec 2018 13:30:09 -1000	[thread overview]
Message-ID: <20181224233009.qwej6e7osjjfk7wl@gmail.com> (raw)
In-Reply-To: <C910A9B2-EFC0-49CC-B980-38127CC81175@dana.is>

[-- Attachment #1: Type: text/plain, Size: 2471 bytes --]

On Mon, Dec 24, 2018 at 03:16:22AM -0600, dana wrote:
> Not directly related, but in reviewing workers/43932 further i found that the
> way ztrftime() handles truncation for %. is problematic:
> 
>   % strftime '%s.%9.' $EPOCHSECONDS $(( 999_999_999 ))
>   1545638724.999999999
>   % strftime '%s.%6.' $EPOCHSECONDS $(( 999_999_000 ))
>   1545638984.999999
>   % strftime '%s.%6.' $EPOCHSECONDS $(( 999_999_999 ))
>   1545638724.100000
> 
> I'm pretty sure it's always been like this, it was just hard to see before
> because there was no way to control the (at the time) microsecond input from
> 'user land'.
> 
> I'm not very good at maths — is there a reason it shouldn't just be a straight
> power-of-ten division like this?
> 
> dana

The reason is because truncation in C just discards the fractional part
of the result. This is not how it works in maths, so If you do it this
way instead of just straight division by 10, the truncation of a number
like 0.999999995 to 8 digits rounds up correctly to 1, whereas he naive
way would just truncate it to 0.99999999:

> hobbes% print -rf '%.9f\n' - 0.999999995
> 0.999999995
> hobbes% print -rf '%.8f\n' - 0.999999995
> 1.00000000
> hobbes% print -rf '%.9f\n' - 0.999999994
> 0.999999994
> hobbes% print -rf '%.8f\n' - 0.999999994
> 0.99999999

Happy snow day!

> diff --git a/Src/utils.c b/Src/utils.c
> index e43a3cdb4..c3badcf77 100644
> --- a/Src/utils.c
> +++ b/Src/utils.c
> @@ -3340,9 +3340,8 @@ morefmt:
>  		    digs = 9;
>  		if (digs < 9) {
>  		    int trunc;
> -		    for (trunc = 8 - digs; trunc; trunc--)
> +		    for (trunc = 9 - digs; trunc; trunc--)
>  			nsec /= 10;
> -		    nsec = (nsec + 8) / 10;
>  		}
>  		sprintf(buf, "%0*ld", digs, nsec);
>  		buf += digs;
> diff --git a/Test/V09datetime.ztst b/Test/V09datetime.ztst
> index 2041d9b40..ed2d99b2f 100644
> --- a/Test/V09datetime.ztst
> +++ b/Test/V09datetime.ztst
> @@ -114,3 +114,15 @@
>  
>    strftime -r '%Y' 2> /dev/null
>  1:-r timestring not optional
> +
> +  for 1 in %. %1. %3. %6. %9. %12.; do
> +    print -rn - "$1 "
> +    strftime "%Y-%m-%d %H:%M:%S.$1" 1012615322 $(( 999_999_999 ))
> +  done
> +0:%. truncation
> +>%. 2002-02-02 02:02:02.999
> +>%1. 2002-02-02 02:02:02.9
> +>%3. 2002-02-02 02:02:02.999
> +>%6. 2002-02-02 02:02:02.999999
> +>%9. 2002-02-02 02:02:02.999999999
> +>%12. 2002-02-02 02:02:02.999999999
> 

-- 
Cheers,
Joey Pabalinas

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  parent reply	other threads:[~2018-12-24 23:30 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <d7b0451f90bdfe61f48cc1361690180e07158900.camel@ntlworld.com>
     [not found] ` <b8851c3a50bd8bceba1961f2f764e1a6869481ac.camel@ntlworld.com>
2018-12-20 22:25   ` The big kre zsh bug report Martijn Dekker
2018-12-21  7:53     ` Bart Schaefer
2018-12-21  8:11       ` Fix for ${\var} oddity Bart Schaefer
2018-12-25 17:18       ` [PATCH] honour NO_UNSET when reading values in arithmetic expansion/commands Martijn Dekker
2018-12-25 20:44       ` 'wait' exit status and warnings [was: The big kre zsh bug report] Martijn Dekker
2018-12-30 18:13         ` Peter Stephenson
2019-01-21 22:53           ` Martijn Dekker
2018-12-31  2:08       ` Line continuation between $ and { " Martijn Dekker
2018-12-21 11:30     ` The big kre zsh bug report Robert Elz
2018-12-21 20:37       ` Bart Schaefer
2018-12-22  0:13       ` Robert Elz
2018-12-21  2:28   ` Robert Elz
2018-12-24  5:40 ` zsh 5.6.2-test-2 Axel Beckert
2018-12-24  7:14   ` Axel Beckert
2018-12-24  7:38     ` dana
2018-12-24  9:16       ` [PATCH] ztrftime(): Fix truncation for % dana
2018-12-24 12:45         ` Daniel Shahaf
2018-12-24 16:24           ` dana
2018-12-24 17:06             ` Daniel Shahaf
2018-12-24 17:31               ` dana
2018-12-28 22:16                 ` dana
2018-12-29  9:55                   ` Daniel Shahaf
2018-12-29 10:27                     ` Daniel Shahaf
2018-12-29 11:02                       ` dana
2018-12-29 11:08                         ` Daniel Shahaf
2018-12-29 11:30                           ` dana
2018-12-29 11:34                             ` Daniel Shahaf
2018-12-24 23:35           ` Joey Pabalinas
2018-12-24 23:30         ` Joey Pabalinas [this message]
     [not found] ` <CAKc7PVDUjo8HAdwqgRAKcgQHOzThM+hYnjX+2FKzUZB+pfmC-Q@mail.gmail.com>
     [not found]   ` <CAKc7PVB-agFUarJ=LqC2QNDFta1O5D_o4v-gt7LiobVDohNGVQ@mail.gmail.com>
     [not found]     ` <06228a6975b91f7066d0046bf912dd69fa5993a2.camel@ntlworld.com>
2018-12-31 13:44       ` zsh 4.6.2-test-2 dana
2018-12-31 15:19         ` Sebastian Gniazdowski

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=20181224233009.qwej6e7osjjfk7wl@gmail.com \
    --to=joeypabalinas@gmail.com \
    --cc=dana@dana.is \
    --cc=zsh-workers@zsh.org \
    /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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).