2011-12-04 23 views
6

tôi đang chạy một chương trình bằng C++ trên windows và trên linux. đầu ra có nghĩa là giống hệt nhau. Tôi đang cố gắng để đảm bảo rằng sự khác biệt duy nhất là sự khác biệt thực sự phản đối sự khác biệt trong việc làm trước. cho đến nay tôi đã xử lý tất cả các khác biệt có thể được gây ra bởi sự khác biệt nhưng có một điều mà tôi không thể hình dung ra được.Đã ký số không linux vs windows

trong cửa sổ ra đặt ở đó là một 0,000 và trong linux nó là -0,000

không biết bất kỳ một điều gì đó có thể đó là làm cho sự khác biệt?

thanx

+4

Khó nói khi bạn không hiển thị một đoạn mã có liên quan xuất kết quả đó :) – favoretti

+0

Nó không tạo sự khác biệt, bất kể hay cách bạn nhìn thấy nó. Bạn sẽ làm gì với chữ ký/không dấu? Thêm nó? Mutliply nó? Chia nó? – FailedDev

+0

@ FailedDev: nó tạo sự khác biệt. Hãy suy nghĩ về một hàm có xu hướng 0, nó có thể đến từ phần âm của trục y hoặc từ phần dương của trục y. – ninjalj

Trả lời

1

Vì ở định dạng điểm nổi IEEE bit dấu tách biệt với giá trị, bạn có hai giá trị khác nhau là 0, một giá trị dương và âm. Trong hầu hết các trường hợp, nó không tạo ra sự khác biệt; cả hai số không sẽ so sánh bằng nhau, và chúng thực sự mô tả cùng một giá trị toán học (toán học, 0 và -0 đều giống nhau). Trường hợp sự khác biệt có thể có ý nghĩa là khi bạn có dòng chảy và cần phải biết liệu dòng chảy xảy ra từ một giá trị dương hay từ một giá trị âm. Ngoài ra nếu bạn chia cho 0, dấu của vô hạn bạn nhận được phụ thuộc vào dấu của 0 (tức là 1/+ 0.0 cho + Inf, nhưng 1/-0.0 cho -Inf). Nói cách khác, có lẽ nó sẽ không tạo ra sự khác biệt cho bạn.

Tuy nhiên, lưu ý rằng đầu ra khác nhau không nhất thiết có nghĩa là số đó là khác nhau. Nó cũng có thể là giá trị trong Windows cũng là -0.0, nhưng thường trình đầu ra trên Windows không phân biệt giữa +0.0 và -0.0 (chúng so sánh bằng nhau, sau khi tất cả).

7

Có lẽ nó xuất phát từ sự khác biệt trong cách tôi ưu tối ưu hóa một số tính toán FP (có thể được cấu hình - xem ví dụ here); trong một trường hợp bạn nhận được một giá trị hơi nhỏ hơn 0, trong một chút khác. Cả hai đầu ra được làm tròn thành 0.000, nhưng chúng vẫn giữ dấu "thực" của chúng.

1

Trừ khi sử dụng (không an toàn) cờ như -ffast-math, trình biên dịch bị giới hạn trong các giả định mà nó có thể thực hiện khi 'tối ưu hóa' số học IEEE-754. Trước tiên hãy kiểm tra xem cả hai nền tảng đều đang sử dụng cùng một làm tròn.

Ngoài ra, nếu có thể, hãy kiểm tra xem chúng có đang sử dụng cùng một đơn vị dấu chấm động hay không. tức là SSE và FPU trên x86. Thứ hai có thể là một vấn đề với việc triển khai hàm toán học toán học - đặc biệt là các hàm lượng giác/siêu việt.

+1

làm cách nào để kiểm tra xem họ đang sử dụng đơn vị dấu chấm động nào? – user690936

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