stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Commented: (STDCXX-880) num_put::put(..., 1.0e+4932L, ...) formats "inf"
Date Tue, 22 Apr 2008 00:57:22 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-880?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12591147#action_12591147
] 

Martin Sebor commented on STDCXX-880:
-------------------------------------

I'm not sure about converting {{double}} to {{max_double_t}}. Is it safe in terms of traps
and floating point exceptions? Is it efficient? Why can't we just have three overloads of
these functions for each of the three floating point types?

In any event, it's far too late to be changing the implementation of the {{double}} overloads
to {{long double}}, or to be adding non-trivial implementations the generic functions for
4.2.1. Besides, the new generic functions are unsafe. They must avoid traps, so any kind of
floating point arithmetic is out of the question. On platforms with limited support for these
kinds of things (e.g., HP-UX on PA-RISC where the arguments must be {{float}} or {{double}}
-- see for example the [{{fpclassify(3m)}}|http://docs.hp.com/en/B2355-60130/fpclassify.3M.html]
HP-UX man page) we'll have to implement our own versions by examining the bit patterns ourselves.

For 4.2.1, we need the simplest, safest possible fix, or we need to revert the patch.

> num_put::put(..., 1.0e+4932L, ...) formats "inf"
> ------------------------------------------------
>
>                 Key: STDCXX-880
>                 URL: https://issues.apache.org/jira/browse/STDCXX-880
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 22. Localization
>    Affects Versions: trunk
>            Reporter: Martin Sebor
>            Assignee: Farid Zaripov
>            Priority: Blocker
>             Fix For: 4.2.1
>
>         Attachments: num_put.cpp.diff
>
>   Original Estimate: 2h
>          Time Spent: 1h
>  Remaining Estimate: 1h
>
> The [{{22.locale.num.put.cpp}}|http://svn.apache.org/repos/asf/stdcxx/trunk/tests/localization/22.locale.num.put.cpp]
fails 4 assertions with the head of trunk (see below). The test passes at 100% with 4.2.0.
I reduced the failures to the following test case:
> {noformat}
> $ cat t.cpp && gmake t && ./t 
> #include <cassert>
> #include <cstdio>
> #include <math.h>
> #include <sstream>
> int main ()
> {
>     const long double x = 1.0e+4932L;
>     assert (isnormal (x));
>     std::ostringstream strm;
>     strm << x;
>     char buf [40];
>     std::sprintf (buf, "%Lg", x);
>     if (strm.str () == buf)
>         return 0;
>     std::printf ("%s != %s\n", strm.str ().c_str (), buf);
>     assert (0);
> }
> aCC -c  -D_RWSTDDEBUG   -mt -I/amd/devco/sebor/stdcxx-4.2.x/include -I/build/seb
> or/stdcxx-4.2.x-aCC-6.16-15D//include -I/amd/devco/sebor/stdcxx-4.2.x/tests/incl
> ude  -AA  -g +d  +DD64 +w +W392,655,684,818,819,849 +W2193,2236,2261,2340,2401,2
> 487 +W4227,4229,4231,4235,4237,4249 +W4255,4272,4284,4285,4286,4296,4297 +W3348 
>   t.cpp
> "/amd/devco/sebor/stdcxx-4.2.x/include/loc/_ctype.h", line 545: warning #2186-D:
>  
>           pointless comparison of unsigned integer with zero
>       if (   0 <= __c
>                ^
> "/amd/devco/sebor/stdcxx-4.2.x/include/loc/_ctype.h", line 555: warning #2186-D:
>  
>           pointless comparison of unsigned integer with zero
>       if (   0 <= __c
>                ^
> aCC t.o -o t -L/build/sebor/stdcxx-4.2.x-aCC-6.16-15D//rwtest -lrwtest15D -AA +n
> ostl -Wl,+s   -mt +DD64 -L/build/sebor/stdcxx-4.2.x-aCC-6.16-15D//lib  -Wl,+b/bu
> ild/sebor/stdcxx-4.2.x-aCC-6.16-15D//lib:/build/sebor/stdcxx-4.2.x-aCC-6.16-15D/
> /rwtest -lstd15D  -lm 
> inf != 1e+4932
> Assertion failed: 0, file t.cpp, line 22
> ABORT instruction (core dumped)
> {noformat}
> The output of {{22.locale.num.put}} follows:
> {noformat}
> $ ./22.locale.num.put -q
> # ASSERTION (S7) (4 lines):
> # TEXT: line 377: num_put<char>::put (..., long double = 1.18973e+4932) wrote "inf",
expected "1.18973149535723176508575932662800702e+4932", flags = fmtflags(0), precision = 36
> # CLAUSE: lib.locale.num.put
> # LINE: 1854
> # ASSERTION (S7) (4 lines):
> # TEXT: line 377: num_put<char>::put (..., long double = 1e+4932) wrote "inf",
expected { "1", '0' <repeats 34 times>, "1", '0' <repeats 4897 times> }, flags
= fixed, precision = 0
> # CLAUSE: lib.locale.num.put
> # LINE: 1958
> # ASSERTION (S7) (4 lines):
> # TEXT: line 377: num_put<wchar_t>::put (..., long double = 1.18973e+4932) wrote
L"inf", expected "1.18973149535723176508575932662800702e+4932", flags = fmtflags(0), precision
= 36
> # CLAUSE: lib.locale.num.put
> # LINE: 1854
> # ASSERTION (S7) (4 lines):
> # TEXT: line 377: num_put<wchar_t>::put (..., long double = 1e+4932) wrote L"inf",
expected { "1", '0' <repeats 34 times>, "1", '0' <repeats 4897 times> }, flags
= fixed, precision = 0
> # CLAUSE: lib.locale.num.put
> # LINE: 1958
> # +-----------------------+----------+----------+----------+
> # | DIAGNOSTIC            |  ACTIVE  |   TOTAL  | INACTIVE |
> # +-----------------------+----------+----------+----------+
> # | (S1) INFO             |       96 |       96 |       0% |
> # | (S2) NOTE             |        1 |        1 |       0% |
> # | (S5) WARNING          |        2 |        2 |       0% |
> # | (S7) ASSERTION        |        4 |     1671 |      99% |
> # +-----------------------+----------+----------+----------+
> {noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message