2009-05-08 67 views
11

Gần đây, đôi khi (hiếm khi) khi chúng tôi xuất dữ liệu từ ứng dụng của chúng tôi, nhật ký xuất chứa các giá trị nổi trông giống như "-1. # J". Tôi đã không thể tái tạo nó vì vậy tôi không biết những gì nổi trông giống như trong nhị phân, hoặc làm thế nào Visual Studio hiển thị nó.Lỗi dấu phẩy động -1. # J có nghĩa là gì?

Tôi đã thử xem mã nguồn cho printf, nhưng không tìm thấy bất kỳ thứ gì (không chắc chắn 100% tôi đã xem phiên bản phù hợp ...).

Tôi đã thử googling nhưng google ném đi bất kỳ #, có vẻ như. Và tôi không thể tìm thấy bất kỳ danh sách lỗi nổi nào.

+0

Xem thêm: http://stackoverflow.com/questions/5541975/what-does-1-mean/5542066#5542066 –

Trả lời

27

Nó có thể là vô cực âm hoặc NaN (không phải là số). Do định dạng trên printf trường không phân biệt giữa chúng.

Tôi đã thử các mã sau trong Visual Studio 2008:

double a = 0.0; 
printf("%.3g\n", 1.0/a); // +inf 
printf("%.3g\n", -1.0/a); // -inf 
printf("%.3g\n", a/a); // NaN 

mà kết quả trong đầu ra sau đây:

1.#J 
-1.#J 
-1.#J 

tháo specifier .3 định dạng cho phép:

1.#INF 
-1.#INF 
-1.#IND 

vì vậy nó rõ ràng 0/0 cho NaN và -1/0 cho vô cực âm (NaN, -inf và + inf là chỉ có "er "số điểm nổi", nếu tôi gọi lại chính xác)

+0

Thú vị ... Tôi tự hỏi tại sao nó kết thúc với 'J' khi cắt các chỉ số vô hạn/NaN? –

+14

J là kết quả của làm tròn "chữ số" IN đến một vị trí ít hơn. – RBerteig

+3

Bản dịch của NaN và INF thành mã có chữ số hàng đầu và dấu chấm là một sai lầm tổng thể của IMHO. Đó là cách quá dễ dàng để kết thúc với một trường số trong một tập tin văn bản có thể được đọc lại (với một phân tích cú pháp hoàn hảo nhưng đáng tin cậy, phải thừa nhận) là giá trị +1 hoặc -1 mà không giống như giá trị được in. Sẽ tốt hơn nếu viết nó là + # INF, - # INF, v.v. – RBerteig

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