Mam program C++, który działa na obu systemach Windows/Linux. W systemie Windows program jest kompilowany za pomocą Visual Studio 2012 i Linux jest skompilowany z GCC. Przy konwersji podwójnych strun do sprintf wykorzystaniem Visual Studio używa innej metody zaokrąglania niż kompilator GCC dla tej więzi - tj dziesiętne kończąc na 5.C++ Zaokrąglanie zachowanie spójności dla powiązań z sprintf
kompilator Visual Studio wydaje się wykonać round half away from zero natomiast GCC robi round even aka bankierów zaokrągleń.
Runda jest nawet pożądanym zachowaniem.
Czy można zmienić zachowanie zaokrąglania dla ciągów w formacie sprintf w visual studio/windows? Ponieważ potrzebuję, aby zaokrąglenie zachowywało się konsekwentnie między tymi dwoma.
Oto mała próbka C++ program, który ilustruje wyżej opisany problem:
int main()
{
char buffer[100];
double x;
for (x = -0.5; x <= 10.5; x += 1.0)
{
sprintf(buffer,"%4g %.0f\n", x, x);
std::cout << buffer;
}
return 0;
}
wyjście systemu Windows. Liczby są zaokrąglone od zera:
wyjście OSX skompilowany przy użyciu Xcode. Liczby są zaokrąglone użyciu runda nawet w kierunku parzystej liczbie:
wyjścieOSX:
Możesz zajrzeć do tego artykułu i jego komentarzy: http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/ – NathanOliver
zawsze możesz użyć własnego {*} printf funkcje – technosaurus
[Różnice zaokrąglania w systemie Windows vs Unix w sprintf] (http://stackoverflow.com/q/4649554/995714) –