2015-12-02 17 views
10

Hãy xem xét ví dụ những con số tăng gấp đôi độ chính xác sau:Có unary trừ đi chỉ là dấu hiệu thay đổi?

x = 1232.2454545e-89; 
y = -1232.2454545e-89; 

Tôi có thể chắc chắn rằng y phải lúc nào cũng chính xác bằng -x (hoặc Matlab của uminus(x))? Hoặc tôi có nên mong đợi sự khác biệt về số lượng nhỏ của đơn đặt hàng hoặc eps vì nó thường xảy ra với tính toán số không? Hãy thử ví dụ sqrt(3)^2-3: kết quả không chính xác bằng không. Điều đó có thể xảy ra với unary trừ đi không? Có phải là mất mát như căn bậc hai không?

Một cách khác để đặt câu hỏi là: là một chữ số tiêu cực luôn luôn bằng với phủ định đối tác tích cực của nó?

Câu hỏi của tôi đề cập đến Matlab, nhưng có thể có nhiều việc phải làm với chuẩn IEEE 754 hơn là với Matlab.

Tôi đã thực hiện một số thử nghiệm trong Matlab với một vài số được chọn ngẫu nhiên. Tôi đã thấy rằng, trong những trường hợp đó,

  • Chúng thực sự là như nhau.
  • typecast(x, 'uint8')typecast(-x, 'uint8') chỉ khác nhau ở bit dấu như được xác định bởi IEEE 754 double-precision format.

Điều này cho thấy câu trả lời có thể được khẳng định. Nếu áp dụng unary trừ chỉ thay đổi bit dấu, và không phải là significand, không có độ chính xác bị mất.

Nhưng tất nhiên tôi chỉ thử nghiệm một vài trường hợp. Tôi muốn chắc chắn điều này xảy ra trong mọi trường hợp.

+0

Dường như điều này có thể phụ thuộc vào [chế độ làm tròn] (https://en.wikipedia.org/wiki/Floating_point#Rounding_modes). Bạn có quan tâm đến các số nguyên trong các giá trị dấu chấm động đặc biệt hoặc tùy ý hay không. – horchler

+0

@horchler Giá trị dấu phẩy động tùy ý. Có, tôi đoán làm tròn về 0 sẽ là cần thiết cho câu trả lời để được khẳng định. Nó được biết là chế độ làm tròn mà Matlab sử dụng? –

+0

Không biết. Chế độ làm tròn mặc định cho IEEE-754 là ["đối xứng"] (https://en.wikipedia.org/wiki/Rounding#Round_half_to_even). Tôi đoán rằng nó sử dụng nó, mặc dù nó cũng có thể phụ thuộc vào hệ thống. – horchler

Trả lời

1

Câu hỏi này phụ thuộc vào kiến ​​trúc máy tính. Tuy nhiên, dấu hiệu của các số dấu phẩy động trên kiến ​​trúc hiện đại (bao gồm x64 và lõi ARM) được biểu diễn bằng một bit dấu đơn và chúng có hướng dẫn để lật bit này (ví dụ: FCHS). Trong trường hợp đó, chúng tôi có thể rút ra hai kết luận:

  1. Có thể thay đổi dấu hiệu (và indeed is by modern compilers và kiến ​​trúc) bằng một bit/hướng dẫn bit. Điều này có nghĩa là quá trình này hoàn toàn không thể đảo ngược và không mất độ chính xác về số.
  2. Nó sẽ không có ý nghĩa đối với MATLAB để làm bất cứ điều gì khác hơn là điều nhanh nhất, chính xác nhất, mà chỉ là để lật bit đó.

Điều đó nói rằng, cách duy nhất để chắc chắn là kiểm tra mã lắp ráp cho uminus trong quá trình cài đặt MATLAB của bạn. Tôi không biết làm thế nào để làm điều này.

Các vấn đề liên quan