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')
và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.
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
@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? –
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