Hãy xem xét đoạn mã này:Làm thế nào để có tất cả đầu ra trình biên dịch nền tảng cùng một chuỗi cho NaN?
#include <iostream>
#include <string>
#include <limits>
int main()
{
std::cout << std::numeric_limits<double>::quiet_NaN();
}
Khi biên soạn với Visual Studio 2010, sản lượng là 1.#QNAN
. Khi được biên dịch bằng g ++, đầu ra là nan
. Lưu ý rằng Visual Studio 2015 xuất ra "nan".
Tuy nhiên, tôi cần cả hai để tạo ra cùng một đầu ra. Cách đơn giản nhất để làm điều đó là gì? Tôi đã cố gắng ghi đè operator<<
cho double
nhưng tôi cảm thấy đó không phải là cách phù hợp để thực hiện. Chuỗi có thể được sử dụng cho giá trị NaN
bị buộc ở mức stream
hoặc tốt hơn ở cấp toàn cầu (sử dụng công cụ std::locale
? ... không bao giờ được sử dụng ...).
Tôi đã tìm thấy ví dụ này squaring_num_put. Thú vị vì đó là một cách để sửa đổi một số được chuyển hướng đến đầu ra. Nhưng tôi đang gặp khó khăn trong việc cố gắng thích ứng với vấn đề của mình (Không thể làm cho do_put
gửi một số hoặc một chuỗi "NaN" được mã hóa cứng tới số ostream
...).
* Tôi cần cả hai để tạo đầu ra tương tự *. Âm thanh như một vấn đề XY với tôi ... –
Xuất các số cuối cùng gọi ['std :: num_put :: do_put'] (http://en.cppreference.com/w/cpp/locale/num_put/put) về cơ bản sử dụng ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) để định dạng đầu ra. Và khi các trang tham chiếu ['std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) nói, đầu ra cho NaN phải là' nan' hoặc 'nan (char_sequence)) '. (mà một là thực hiện xác định) Điều này có nghĩa rằng Visual Studio là sai. Nó cũng có nghĩa là ngay cả đối với các trình biên dịch và thư viện tương thích, bạn có hai đầu ra thay thế để xử lý –
Vì vậy, câu hỏi có thể là cách buộc VS2010 xuất "nan" chứ không phải "1. # QNAN" .... tiêu chuẩn và đầu ra "nan", đó là OK. – jpo38