Đang cố gắng chuyển mã java sang C++ Tôi đã vấp phải một số hành vi kỳ lạ. Tôi không thể nhận được thêm đôi để làm việc (mặc dù tùy chọn trình biên dịch/fp: nghiêm ngặt có nghĩa là "chính xác" nổi điểm toán học được thiết lập trong Visual Studio 2008).Tại sao tăng gấp đôi không chính xác trong một dự án Visual Studio 2008 cụ thể?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
Trong một dự án thử nghiệm khác, tôi thiết lập nó hoạt động tốt (/ fp: hoạt động nghiêm ngặt theo IEEE754).
Sử dụng Visual Studio 2008 (tiêu chuẩn) với Không tối ưu hóa và FP: nghiêm ngặt.
Bất kỳ ý tưởng nào? Nó thực sự cắt ngắn để nổi? Dự án này thực sự cần hành vi tương tự trên cả hai mặt java và C++. Tôi có tất cả các giá trị bằng cách đọc từ cửa sổ gỡ lỗi trong VC++.
Giải pháp: _fpreset(); // Ý tưởng của Barry Kelly đã giải quyết nó. Một thư viện đã thiết lập độ chính xác FP xuống thấp.
Bạn có thể đăng một chương trình thử nghiệm hoàn chỉnh nhỏ cùng với dòng lệnh chính xác được sử dụng để biên dịch (xem cửa sổ đầu ra, v.v.), minh họa vấn đề này không? Cách duy nhất tôi có thể tái tạo là bằng cách sử dụng 0.0f + 0.4f thay thế. –
Chúng ta có thể giả định bạn nhận thức được sự thiếu chính xác của các loại dấu phẩy động không? Chính xác đến 7 chữ số thập phân thường được coi là ok vì độ chính xác in mặc định là 6. –
@Evan, ví dụ của anh ta bị tắt bởi nhiều hơn sẽ được giải thích bởi sự không chính xác của dấu phẩy động. – Kevin