https://bugs.winehq.org/show_bug.cgi?id=37913
Bug ID: 37913 Summary: Inconsistent rounding behaviour for sprintf Product: Wine Version: unspecified Hardware: x86 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: msvcp Assignee: wine-bugs@winehq.org Reporter: christopherwuy@gmail.com Distribution: ---
sample source code and output demonstrating the problem: #include <iostream> #include <stdio.h> using namespace std; int main() { double a; a = 3.5; char *tmp = new char(100); char fmt[18] = " is %.0f"; sprintf(tmp, fmt, a); cout<<endl<<a<<tmp<<endl<<endl;
a = -4.5; sprintf(tmp, fmt, a); cout<<endl<<a<<tmp<<endl<<endl;
a = -0.5; sprintf(tmp, fmt, a); cout<<endl<<a<<tmp<<endl<<endl;
a = 2597.625; printf("%.3f", a); sprintf(tmp, " is %.2lf", a); cout<<tmp<<endl<<endl; }
This code running by wine 's Output is: 3.5 is 4 -4.5 is -4 -0.5 is -0 2597.625 is 2597.62
while windows' output is: 3.5 is 4 -4.5 is -5 -0.5 is -1 2597.625 is 2597.63
It indicated that Wine's sprintf used rounding rule which is Round half to even, while windows used Round half away from zero. You can find a detailed discussion of 'similar bug' form https://sourceware.org/bugzilla/show_bug.cgi?id=4943