So sánh một số mã C và F # Tôi đang cố gắng thay thế bằng, tôi quan sát thấy có một số khác biệt trong kết quả cuối cùng.C có đôi khác với .NET không?
Làm việc sao lưu mã, tôi phát hiện ra rằng ngay cả ở đó cũng có sự khác biệt - mặc dù có những khác biệt nhỏ.
Mã bắt đầu bằng cách đọc dữ liệu từ tệp. và con số đầu tiên xuất hiện khác nhau. Ví dụ: trong F # (dễ viết hơn):
let a = 71.9497985840
printfn "%.20f" a
Tôi nhận được kết quả mong đợi (cho tôi) 71.94979858400000000000
.
Nhưng trong C:
a = 71.9497985840;
fprintf (stderr, "%.20f\n", a);
in ra 71.94979858400000700000
.
7 từ đó đến từ đâu?
Sự khác biệt chỉ nhỏ, nhưng nó làm phiền tôi vì tôi không biết tại sao. (Nó cũng làm phiền tôi bởi vì nó làm cho nó khó khăn hơn để theo dõi nơi hai phiên bản mã của tôi đang phân kỳ)
Bạn có chắc chắn cả hai giá trị đều tăng gấp đôi? Bạn có chắc là lỗi không được in? – Euphoric
số học dấu chấm động trong .net không có kết quả chính xác được xác định rõ. Nó chỉ là một xấp xỉ. Các chữ số thấp hơn có thể thay đổi theo ý thích của trình biên dịch và JITer, và chỉ quan sát chúng với một cái gì đó như 'printfn' có thể ảnh hưởng đến chúng. – CodesInChaos
Sử dụng trình gỡ lỗi hoặc thứ gì đó để xem mẫu bit chính xác của các biến. Nếu cả triển khai F # và C bạn sử dụng cùng một định dạng dấu phẩy động và các biến có cùng một mẫu bit, thì sự khác nhau là trong bản in hoặc cách trình biên dịch phân tích chữ nổi. Trong cả hai trường hợp, vì các dấu phẩy động chỉ là các phép tính xấp xỉ, nó có thể không có gì phải lo lắng, vì sự khác biệt là khá nhỏ. –