Tôi có thuật toán/tính toán trong Java và kiểm tra đơn vị cho nó. Kiểm tra đơn vị mong đợi kết quả với một số độ chính xác/delta. Bây giờ tôi chuyển algo vào .NET và muốn sử dụng cùng một bài kiểm tra đơn vị. Tôi làm việc với kiểu dữ liệu kép.Thư viện cho điểm nổi chính xác trong .NET
Vấn đề là Java sử dụng strictfp (64 bit) cho một số thao tác trong lớp Toán. Khi .NET sử dụng FPU/CPU luôn (80 bit). .NET chính xác hơn và nhanh hơn. Java dễ dự đoán hơn.
Vì bản ngã của tôi là tuần hoàn và tái sử dụng kết quả từ vòng trước, lỗi/chênh lệch/độ chính xác hơn tích lũy quá lớn. Tôi không dựa vào tốc độ (để kiểm tra đơn vị). Và tôi rất vui khi sử dụng độ chính xác .NET trong sản xuất, nhưng tôi muốn xác thực việc triển khai.
Hãy xem xét điều này từ JDK
public final class Math {
public static double atan2(double y, double x) {
return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
}
}
Tôi đang tìm thư viện hoặc kỹ thuật để sử dụng nghiêm ngặt FP trong .NET.
Nhận xét ưu tiên: Tôi hiểu định dạng IEEE 754 và thực tế là số dấu phẩy động không phải là số thập phân hoặc phân số chính xác. Không có thập phân, không có BigInt hoặc BigNumber. Xin đừng trả lời theo cách này, cảm ơn.
Tôi không hiểu thử nghiệm đơn vị của bạn đang thử nghiệm gì nếu bạn sử dụng các triển khai toán toán dấu phẩy động khác nhau giữa Thử nghiệm và Sản xuất Đơn vị. Bạn không chạy các nguy cơ không bắt gặp một lỗi mà chỉ biểu hiện với việc thực hiện .NET? –
Bản ngã/toán là một phần của bài kiểm tra tích hợp lớn hơn. Vì vậy, tôi cần thành phần này để hành xử giống hệt nhau. Chỉ cần cho thử nghiệm nó cần phải có cùng (nghiêm ngặt) làm tròn như Java, mà thực sự là ít chính xác hơn. –
Nó thậm chí còn tệ hơn nữa. Thảo luận này cho thấy rằng CLR có thể quyết định biên dịch mã để sử dụng điểm nổi 80-bit x87 hoặc 64 bit SSE2: https://connect.microsoft.com/VisualStudio/feedback/details/276107/provide-access -to-the-floating-point-context –