• Andrew Gierth's avatar
    Use strtof() and not strtod() for float4 input. · f397e085
    Andrew Gierth authored
    Using strtod() creates a double-rounding problem; the input decimal
    value is first rounded to the nearest double; rounding that to the
    nearest float may then give an incorrect result.
    
    An example is that 7.038531e-26 when input via strtod and then rounded
    to float4 gives 0xAE43FEp-107 instead of the correct 0xAE43FDp-107.
    
    Values output by earlier PG versions with extra_float_digits=3 should
    all be read in with the same values as previously. However, values
    supplied by other software using shortest representations could be
    mis-read.
    
    On platforms that lack a strtof() entirely, we fall back to the old
    incorrect rounding behavior. (As strtof() is required by C99, such
    platforms are considered of primarily historical interest.) On VS2013,
    some workarounds are used to get correct error handling.
    
    The regression tests now test for the correct input values, so
    platforms that lack strtof() will need resultmap entries. An entry for
    HP-UX 10 is included (more may be needed).
    
    Reviewed-By: Tom Lane
    Discussion: https://postgr.es/m/871s5emitx.fsf@news-spur.riddles.org.uk
    Discussion: https://postgr.es/m/87d0owlqpv.fsf@news-spur.riddles.org.uk
    f397e085
float4.out 10.5 KB