stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martin Sebor <se...@roguewave.com>
Subject Re: [jira] Resolved: (STDCXX-2) [MSVC] std::num_put bad formatting of 0.0 with precision and showpoint
Date Tue, 05 Jun 2007 15:42:00 GMT
I'm afraid closing this issue as Won't Fix is not appropriate. We
do need to fix it.

The C++ standard says the num_put face behaves "as if" if it called
sprintf with the specified format directive. The C standard, in turn,
specifies the exact output to be produced. That fact that Microsoft's
implementation of sprintf() fails to conform to the requirements of
the C standard doesn't mean we don't have to. Rather it means that
we cannot rely of Microsoft's sprintf() to implement the facet and
instead have to code it "as if" it were implemented in terms of
a sprintf() that does conform.

Btw., avoiding sprintf() and writing our own formatting routine
might actually yield more efficient code (the performance of
floating point I/O is one of stdcxx weaknesses).

Martin

Farid Zaripov (JIRA) wrote:
>      [ https://issues.apache.org/jira/browse/STDCXX-2?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
> 
> Farid Zaripov resolved STDCXX-2.
> --------------------------------
> 
>     Resolution: Won't Fix
> 
> The problem in the MSVC CRT. 
> 
> The expression strm << 0.0; is invokes the __rw_put_num() function, where used
the CRT function snprintf() (num_put.cpp, line 752):
> 
> snprintf (buf, size, "%#.2lg", 0.0);
> 
> The result of the snprintf() call above is: "0.00".
> 
> Info from MSDN:
> -----------------------------
> Flag '#' means: When used with the g or G format, the # flag forces the output value
to contain a decimal point in all cases and prevents the truncation of trailing zeros.
> 
> The precision (".2") means: The precision specifies the maximum number of significant
digits printed.
> -----------------------------
> 
> The prefix 'l' before type character 'g' here should point to the long double type, but
passed double number (0.0). Anyway this is not causes any problem because of the types double
and long double have the same internal representation on the MSVC.
> 
> 
>> [MSVC] std::num_put bad formatting of 0.0 with precision and showpoint
>> ----------------------------------------------------------------------
>>
>>                 Key: STDCXX-2
>>                 URL: https://issues.apache.org/jira/browse/STDCXX-2
>>             Project: C++ Standard Library
>>          Issue Type: Bug
>>          Components: 22. Localization
>>    Affects Versions: 4.1.2
>>         Environment: Windows/MSVC
>>            Reporter: Martin Sebor
>>            Assignee: Farid Zaripov
>>
>> When compiled with MSVC (any version), the program below aborts at runtime.
>> $ cat t.cpp && cl  -D_RWCONFIG=11s_msvc_7_1 -Ic:/contrib/cygwin/build/sebor/dev-hal/include
-I./../../../../include -Ic:/contrib/cygwin/build/sebor/dev-hal/examples/stdlib/manual/../include
 -Ic:/contrib/cygwin/build/sebor/dev-hal/include/ansi -I./../../../..
>> -Ic:/contrib/cygwin/build/sebor/dev-hal -Ic:/contrib/cygwin/build/sebor/dev-hal/examples/stdlib/manual
-I. -nologo -GX -MLd -W3 -Zi -GA -GR -GF -GZ  -c t.cpp && link  -nologo /NODEFAULTLIB:libcpd
/debug /LIBPATH:./../../../../lib /OUT:t.exe t.obj  std11s_msvc_7_1.lib user32.lib t.cpp &&
./t.exe
>> #include <cassert>
>> #include <sstream>
>> int main ()
>> {
>>     std::ostringstream strm;
>>     strm.setf (strm.showpoint);
>>     strm.precision (2);
>>     strm << 0.0;
>>     assert ("0.0" == strm.str ());
>> }
>> Assertion failed: "0.0" == strm.str (), file t.cpp, line 13
> 


Mime
View raw message