2010-09-14 71 views
7

Trong C++, ví dụ fmod(-2,2) trả về -0. Biểu thức -0 == 0 là đúng, nhưng các bit khác nhau. Mục đích của việc có một cái gì đó như -0 phải là 0 nhưng được thể hiện khác nhau là gì? Có phải -0 được sử dụng chính xác giống như 0 trong bất kỳ tính toán nào không?Sự khác nhau giữa -0 và 0 là gì?

+2

Tôi tin rằng 1/0 là cực dương và 1/-0 là vô cực âm. Khác hơn là tôi không biết. –

+3

Tôi không chắc liệu chênh lệch giữa -0 và 0 là -0 hay 0, –

Trả lời

13

Không, +0-0 không được sử dụng theo cách tương tự trong mọi tính toán. Ví dụ:

3·(+0) = +0 
+0/-3 = -0 

Tôi đề nghị bạn đọc What Every Computer Scientist Should Know About Floating-point arithmetic David Goldberg, mà tỏ một ánh sáng về việc tại sao +0 và -0 là cần thiết trong nổi điểm số học và trong đó cách chúng khác nhau.

Ví dụ về cách +0 quảng cáo -0 khác nhau (và tại sao có thể hữu ích khi xử lý các giá trị phức tạp) có thể được tìm thấy trong Kahan, W. 1987. Cắt giảm chi tiêu cho hàm tiểu học phức tạp, trong "Nhà nước của nghệ thuật trong số Phân tích "(Tôi đã không thể tìm thấy một pdf của bài viết này, bạn có thể tìm thấy một tại thư viện đại học địa phương của bạn).

+0

Liên kết giải thích nó theo cách tốt! – Danvil

3

Chuẩn IEEE 754 cho phép cả +0 và -0. Cùng một mantissa, dấu hiệu khác nhau. Chúng phải giống nhau trong tính toán.

+1

Trừ khi chúng khác nhau; Ví dụ: '1/x'. –

+0

Được rồi, khác biệt. Tôi không chia cho số không thường xuyên, vì vậy tha thứ cho tôi. – alxx

10

Trang Wikipedia Signed Zero sẽ trả lời hầu hết các câu hỏi sau:

Signed zero là zero với một liên dấu. Trong số học thông thường, −0 = 0. Tuy nhiên, trong tính toán, một số biểu diễn cho phép tồn tại của hai số không, thường biểu thị bằng −0 (số không âm) và +0 (dương không). Điều này xảy ra trong một số biểu tượng số đã ký cho các số nguyên, và trong hầu hết các số dấu phẩy động . Số 0 là thường được mã hóa là +0, tuy nhiên, nó có thể được biểu thị bằng dấu +0 hoặc −0.

Các tiêu chuẩn IEEE 754 cho nổi điểm số học (hiện nay được sử dụng bởi hầu hết máy tính và lập trình ngôn ngữ hỗ trợ floating point số) đòi hỏi cả hai +0 và -0. Các sốcó thể được coi là biến thể của đường số thực mở rộng như mà 1/−0 = −∞ và 1/+ 0 = + ∞, phân chia bằng 0 chỉ không xác định cho ± 0/± 0.

(...)

Người ta cho rằng sự bao gồm của ký zero trong IEEE 754 làm cho nó nhiều dễ dàng hơn để đạt được độ chính xác số trong một số vấn đề quan trọng, trong đặc biệt khi tính toán với phức tạp tiểu học chức năng.

-3

tôi tin rằng dấu âm là do thực hiện fmod (sai?), Khi bit dấu được xử lý rõ ràng và được đính kèm trở lại kết quả vào cuối quá trình xử lý.

+0

Tôi yêu downvotes mà không có ý kiến ​​ – YeenFei

+3

-1 câu trả lời sai – Tomas

+0

@Tomas, trả lời xây dựng. – YeenFei

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