Compiler: 64-bit MinGW G++ 4.9.1 from the Nuwen distro, under Windows 8.1.
Code:
#ifdef INCLUDE_IOSTREAM
# include <iostream>
#endif
#include <stdio.h> // ::snprintf
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
#include <stdexcept> // std::exception
#ifdef snprintf
# error snprintf defined as macro
#endif
#ifdef _MSC_VER
auto const snprintf = _snprintf;
#endif
void test( double const value, int const precision)
{
char buffer[34];
snprintf( buffer, sizeof( buffer ), "%.*a", precision, value );
printf( "Hex of %.3f with %2d digits: %s\n", value, precision, buffer );
}
auto main() -> int
{
using namespace std;
try
{
for( int precision = 6; precision <= 8; ++precision )
{
test( 5.0, precision );
}
test( 0.0, 14 );
return EXIT_SUCCESS;
}
catch( exception const& x )
{
fprintf( stderr, "!%s\n", x.what() );
}
return EXIT_FAILURE;
}
Works fine with Visual C++ (but Visual C++ appears to lack the opposite conversion):
H:\dev\test\so\0187>cl /nologo- /? 2>&1 | find /i "ler ver" Microsoft (R) C/C++ Optimizing Compiler Version 18.00.30723 for x86 H:\dev\test\so\0187>cl barx.cpp -D INCLUDE_IOSTREAM /Feb barx.cpp H:\dev\test\so\0187>b Hex 5.000 with 6 digits: 0x1.400000p+2 Hex 5.000 with 7 digits: 0x1.4000000p+2 Hex 5.000 with 8 digits: 0x1.40000000p+2 Hex 0.000 with 14 digits: 0x0.00000000000000p+0 H:\dev\test\so\0187>_
Also works fine with g++ when <iostream>
is not included:
H:\dev\test\so\0187>g++ --version | find "++" g++ (GCC) 4.9.1 H:\dev\test\so\0187>g++ -std=c++11 barx.cpp H:\dev\test\so\0187>a Hex of 5.000 with 6 digits: 0x1.400000p+2 Hex of 5.000 with 7 digits: 0x1.4000000p+2 Hex of 5.000 with 8 digits: 0x1.40000000p+2 Hex of 0.000 with 14 digits: 0x0.00000000000000p+0 H:\dev\test\so\0187>_
Bizarre result w/hang when <iostream>
is included:
H:\dev\test\so\0187>g++ -std=c++11 -D INCLUDE_IOSTREAM barx.cpp H:\dev\test\so\0187>a Hex of 5.000 with 6 digits: 0xa.000000p-1 Hex of 5.000 with 7 digits: 0xa.0000000p-1 Hex of 5.000 with 8 digits: 0x0.00000000p-33 ← Weird. ^C ← Hang, Ctrl+C H:\dev\test\so\0187>_
I’m asking for a fix or workaround.
Microsoft's implementation has a number of printf
bugs, and these affect MinGW by default (#377, #407, et al).
In all cases the recommendation appears to be to define __USE_MINGW_ANSI_STDIO
as 1
in the preprocessor to use MinGW's own ANSI-compliant implementation instead.
Presumably, Visual Studio has its own internal workarounds for the flaws in the underlying system code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With