printf can't handle the '+' char in front of an integer

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Wed Oct 31 11:34:58 UTC 2018


On Wed, 31 Oct 2018 at 00:36, Denys Vlasenko <vda.linux at googlemail.com> wrote:
>
> On Fri, Oct 19, 2018 at 3:43 PM Bernhard Reutner-Fischer
> <rep.dot.nop at gmail.com> wrote:
> > On Fri, 19 Oct 2018 at 15:30, Bernhard Reutner-Fischer
> > <rep.dot.nop at gmail.com> wrote:
> > > On Fri, 19 Oct 2018 at 11:03, Cristian Ionescu-Idbohrn
> > > <cristian.ionescu-idbohrn at axis.com> wrote:
> >
> > Oh, an I should mention that on a 64bit box we diverge from coreutils printf:
> >
> > $ printf "%f\n" '  +18446744073709551614'
> > 18446744073709551614.000000
> > $ ./busybox printf "%f\n" '  +18446744073709551614'
> > 18446744073709551616.000000
>
> It's far worse than that:
>
> $ ./busybox printf "%f\n" 18446744073709550592 18446744073709553665
> 18446744073709551616.000000
> 18446744073709551616.000000
>
> 64-bit double's mantissa is only 53 bits...
>
> With "long double" shenanigans, I managed to "improve" this to:
>
> $ ./busybox printf "%f\n" 18446744073709550592 18446744073709553665
> 18446744073709550591.500000
> 18446744073709553663.500000
>
> at this cost:
>
> function                                             old     new   delta
> printf_main                                          909     976     +67
> strtold                                                -      19     +19
> print_direc                                          457     475     +18
> conv_strtod                                           54      61      +7
> ------------------------------------------------------------------------------
> (add/remove: 3/0 grow/shrink: 3/0 up/down: 130/0)             Total: 111 bytes
>
> See attached. Do you think it's worth it?

I don't know.
long double can be very slow (emulated) and complex to support, which
might not be of concern here though.
But first and foremost nobody complained yet AFAIK.
Maybe keep it as is? Actively reject values too large for plain double
in printf(1) for now?
dunno.


More information about the busybox mailing list