2011-10-30 44 views
19

Cân nhắc C++ mã sau:Sử dụng cho giá trị điểm dấu phẩy động không?

double someZero = 0; 
std::cout << 0 - someZero << '\n'; // prints 0 
std::cout << -someZero << std::endl; // prints -0 

Câu hỏi đặt ra: tiêu cực không tốt là gì, và nên nó được phòng thủ tránh được (ví dụ: sử dụng phép trừ thay vì smacking dấu trừ vào một biến)?

+0

http://en.wikipedia.org/wiki/Signed_zero –

Trả lời

0

Số không âm có ví dụ một số sử dụng khi xử lý các số phức ...

Trong trường hợp sử dụng hàng ngày, phần lớn nên tránh số âm.

Một số liên kết với các thông tin liên quan đến nền/sử dụng/cạm bẫy của "zero tiêu cực":

20

Từ Wikipedia:

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

Tham chiếu đầu tiên là "Cắt giảm chi nhánh cho hàm tiểu học phức tạp hoặc nhiều Ado về dấu hiệu không có gì" của W. Kahan, có sẵn để tải xuống here.

Một ví dụ từ bài báo đó là 1/(+0)1/(-0). Ở đây, dấu bằng không tạo ra sự khác biệt lớn, vì biểu thức đầu tiên bằng +inf và dấu thứ hai, -inf.

+2

+1 để có liên kết đến bài báo của Kahan. – njuffa

+0

Tôi yêu các tài liệu được viết bằng HanxWriter. ;-) – Phil

+0

Mặc dù điều đó không giải thích những gì sử dụng chữ ký số không có trong một ngôn ngữ lập trình. –

0

Chỉ có hai thực trường hợp sử dụng mà tôi có thể thấy:

  1. Bạn muốn thể hiện rằng một giá trị tiêu cực nhưng rất rất nhỏ (có lẽ infinitessimal), tức là quá nhỏ để biểu diễn như một phao hoặc gấp đôi.
  2. Bạn đang làm việc với toán học chỉ cho phép phủ định, nhưng vẫn muốn hiển thị bằng không. Có một vài trường hợp trong vật lý, số phức và lý thuyết số nơi điều này có thể hữu ích.

Đối với đa số, nó không hữu ích và cần tránh.

Bạn cũng có thể xem câu hỏi này: Is there a negative zero?IEEE 754 spec cho điểm nổi.

3

Ngoài Signed Zero, Tốt Mục đích:

Các zero có thể được coi là một biến thể của dòng mở rộng số thực như vậy mà 1/-0 = -∞ và 1/+ 0 = + ∞, chia bởi số không chỉ là không xác định cho ± 0/± 0.

Ký hiệu phân tích toán bằng 0 về phía dưới là giới hạn một chiều, có thể được biểu thị bằng x → 0−, x → 0− hoặc x → ↑ 0. Ký hiệu "−0" có thể được sử dụng không chính thức để biểu thị một số âm nhỏ đã được làm tròn thành 0. Khái niệm về số không âm cũng có một số ứng dụng lý thuyết trong cơ học thống kê và các ngành khác

+2

Tôi tự hỏi liệu có ích gì khi có ba số không: dương, âm, và không dấu, trừ hai số âm, hoặc thêm hai số dấu trái và độ lớn bằng nhau, cho ra một số không dấu? Phân chia bởi một số không có chữ ký sẽ mang lại vô cùng, nhưng chia cho một số không dấu sẽ mang lại một NaN. – supercat

0

Tôi đang làm một ứng dụng đo lường, và -0 rất hữu ích cho các số hỗn hợp (chẳng hạn như tách thành bàn chân và inch).

Hãy tưởng tượng rằng chúng tôi có một "độ dài" thay đổi mà chúng tôi đang cố gắng tách thành "chân" và "inch".

(Đây là mã java, nhưng ý tưởng tương tự cũng đúng với C++).

feet = Math.signum(length) * Math.floor(Math.abs(length/12)); 
// could also do feet = length>0 ? Math.floor(length/12) : Math.ceil(length/12) 
inches = Math.abs(length) % 12; 

Nếu chiều dài từ -1 đến 0 feet, chúng tôi muốn nói -0 cho bàn chân để chúng tôi biết là âm tính.

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