2015-06-30 12 views
6

Tôi có một chương trình C++ chạy trên cả Windows/Linux. Trên Windows chương trình được biên dịch với Visual Studio 2012 và Linux nó được biên dịch với GCC. Khi chuyển đổi đôi thành chuỗi sử dụng sprintf Visual Studio đang sử dụng phương thức làm tròn khác với trình biên dịch GCC cho các mối quan hệ - tức là số thập phân kết thúc bằng 5.C++ Làm tròn hành vi nhất quán cho các mối quan hệ với sprintf

Trình biên dịch Visual Studio xuất hiện để thực hiện round half away from zero trong khi GCC thực hiện làm tròn.

Vòng chẵn là hành vi mong muốn.

Có thể thay đổi hành vi làm tròn được sử dụng cho chuỗi định dạng sprintf trong studio/cửa sổ trực quan không? Khi tôi cần phải làm tròn luôn hành xử nhất quán giữa hai người.

Đây là một mẫu C nhỏ chương trình ++ minh họa hành vi mô tả ở trên:

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; 
} 

của Windows ra. Các số được làm tròn đi từ zero:

windows

OSX sản lượng biên soạn sử dụng Xcode. Các số được làm tròn bằng vòng thậm chí đối với các số chẵn:

osx

OSX đầu ra:

+1

Bạn có thể muốn xem bài viết này và nhận xét của bài viết: http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/ – NathanOliver

+0

bạn luôn có thể sử dụng bản in {*} của riêng mình chức năng – technosaurus

+0

[Làm tròn sự khác biệt trên Windows vs hệ thống dựa trên Unix trong sprintf] (http://stackoverflow.com/q/4649554/995714) –

Trả lời

2

Đây là thực hiện được xác định hành vi từ dự thảo C11 tiêu chuẩn phần 7.21.6.1 Chức năng fprintf trong đó bao gồm sprintf sự tôn trọng cho định dạng specifiers với và cũng C++ vì tiêu chuẩn C++ dựa trên tiêu chuẩn C cho các hàm stdio, nó nói cho định dạng số f:

Giá trị được làm tròn thành số chữ số thích hợp.

này cũng được bao phủ bởi defect report 211 mà thêm như sau:

Độ chính xác của các hoạt động nổi-điểm (+, -, *, /) và các chức năng thư viện trong và trở lại nổi -kết quả điểm là thực hiện được xác định, cũng như độ chính xác của việc chuyển đổi giữa các biểu diễn bên trong dấu phẩy động và các biểu diễn chuỗi được thực hiện bởi thường trình libray trong, và. Việc thực hiện có thể nói rằng độ chính xác là không rõ.

bài viết Inconsistent Rounding of Printed Floating-Point Numbers bao gồm sự mâu thuẫn này trong chi tiết tuyệt vời và nói rằng:

glibc printf() đã được cập nhật để có những hiện chế độ làm tròn IEEE vào tài khoản. Điều này đã được thực hiện trong phiên bản 2.17; Tôi vừa thử nghiệm nó trên phiên bản 2.18. Bằng cách làm theo cách này tất nhiên, từ tròn đến gần nhất/nửa vòng-xa-0 vẫn không phải là một lựa chọn, do đó, điều này không giúp bạn làm cho sản lượng của nó phù hợp với các nền tảng khác.

nhưng như đã nói điều này không giúp tính nhất quán trên nền tảng.

Các vấn đề liên quan