2010-02-25 10 views
6

Tôi có một ứng dụng được viết bằng C# cũng gọi một số mã C. Mã C# nhận được một số gấp đôi làm đầu vào, thực hiện một số phép tính trên nó, chuyển nó tới lớp gốc để thực hiện các phép tính riêng của nó trên nó, và sau đó quay trở lại lớp C#.Có thể tính điểm nổi khác nhau trên các bộ vi xử lý khác nhau không? (+ chuyển đôi giữa C# và C)

Nếu tôi chạy cùng một exe/dll trên các máy khác nhau (tất cả đều là x64 của Intel), có thể kết quả cuối cùng tôi nhận được sẽ khác nhau trên các máy khác nhau không?

+2

Câu hỏi thú vị ... đặc biệt là đối với những người nhớ lỗi Pentium FDIV khét tiếng trong bộ vi xử lý Pentium gốc. – Nick

Trả lời

4

Nếu bạn sử dụng cùng (các) tệp thi hành, kết quả sẽ giống nhau. Tuy nhiên, cần lưu ý rằng các tính toán dấu phẩy động thường được tùy biến cao bởi một số cài đặt liên tục (chế độ vô cùng, chế độ làm tròn, v.v.). Điều này có nghĩa rằng cùng một lệnh dấu phẩy động có thể tạo ra các kết quả khác nhau tùy thuộc vào sự kết hợp hiện tại của các thiết lập. Nếu ứng dụng của bạn đảm bảo rằng tất cả các cài đặt này được đặt lại về cùng các giá trị ở đầu quá trình thực thi thì kết quả sẽ giống nhau. Tuy nhiên, nếu một số cài đặt này không được đặt lại hoặc phụ thuộc vào các tham số bên ngoài (như biến môi trường), thì trong một số trường hợp, bạn có thể kết thúc quan sát các kết quả khác nhau trên các máy khác nhau.

+0

loại biến môi trường nào có thể ảnh hưởng đến tính toán dấu phẩy động? –

+0

@opc: Đó sẽ là vấn đề của trình tải ứng dụng dành riêng cho hệ điều hành cũng như mã khởi động của ứng dụng. Tôi chỉ nói rằng kể từ khi tính toán dấu phẩy động bị ảnh hưởng bởi các thiết lập liên tục (ứng dụng toàn cầu), thiết lập ban đầu của các cài đặt này quan trọng. Và nó có thể phụ thuộc hoàn toàn vào bất cứ thứ gì, kể cả các biến môi trường. – AnT

0

Phần cứng chính nó nên tất cả nên làm điều đó theo cùng một cách, giả sử rằng họ thực hiện các hoạt động điểm nổi IEEE, và tôi nghĩ rằng hầu hết (tất cả?) Làm.

http://en.wikipedia.org/wiki/IEEE_754-2008

0

Phần cứng hiện đại nhất được chuẩn hóa, cũng như định nghĩa gấp đôi. Bạn có thể kiểm tra xem cả hai đều đang sử dụng cùng một loại bằng cách kiểm tra dấu chân bộ nhớ của mỗi biến - ví dụ: sizeof (x).

Cũng nên có một số thông tin để thăm dò ý kiến ​​trong float.h.

Từ những gì tôi nhớ, int có xu hướng có vấn đề hơn trong các điều khoản nhất quán. Một số mặc định là 2 byte, một số khác là 4, nhưng bạn luôn có thể sử dụng lâu để đảm bảo kích thước.