Các tập lệnh x86 có các vấn đề nhất quán về điểm nổi khó tính do cách FPU hoạt động. Tính toán nội bộ được thực hiện với các bit quan trọng hơn có thể được lưu trữ trong một đôi, gây cắt ngắn khi số lượng được flushed từ FPU stack vào bộ nhớ.
Điều đó đã được sửa trong trình biên dịch JIT x64, nó sử dụng lệnh SSE, thanh ghi SSE có cùng kích thước gấp đôi.
Điều này sẽ giúp bạn tính toán các ranh giới của độ chính xác và phạm vi của dấu phẩy động. Bạn không bao giờ muốn nhận được gần hơn cần nhiều hơn 15 chữ số đáng kể, bạn không bao giờ muốn nhận được gần 10E308 hoặc 10E-308. Bạn chắc chắn không bao giờ muốn vuông giá trị đại diện lớn nhất. Đây không bao giờ là một vấn đề thực sự, những con số đại diện cho số lượng vật lý không đến gần.
Sử dụng cơ hội này để tìm hiểu xem có vấn đề gì với tính toán của bạn. Điều rất quan trọng là bạn chạy cùng một hệ điều hành và phần cứng mà khách hàng của bạn đang sử dụng, thời gian cao để bạn có được các máy cần thiết để làm như vậy. Mã vận chuyển chỉ được thử nghiệm trên máy x86 không được kiểm tra.
Q & D sửa là Dự án + Thuộc tính, tab biên dịch, Nền tảng đích = x86.
Fwiw, kết quả xấu trên x86 do lỗi trong trình biên dịch JIT gây ra.Nó tạo mã này:
double r = Math.Sqrt(v1 * v1);
00000006 fld dword ptr ds:[009D1578h]
0000000c fsqrt
0000000e fstp qword ptr [ebp-8]
Hướng dẫn fmul bị thiếu, bị xóa bởi trình tối ưu hóa mã trong chế độ phát hành. Không nghi ngờ gì được kích hoạt bởi nó nhìn thấy giá trị ở double.MaxValue. Đó là một lỗi, bạn có thể báo cáo nó tại connect.microsoft.com. Khá chắc chắn họ sẽ không sửa chữa nó mặc dù.
Nguồn
2010-03-17 10:29:32
Sản lượng '+ inf' trên cả máy 32 và 64 bit tại đây. – Joey