C++11で<string>ヘッダに追加されたstd::to_string()関数ですが、この関数にfloat型の値NaNもしくはinfinityを渡したら、どんな結果になるのか。エラーになるのか、もしくは正常に終了するならどんな文字列になるか。やってみましょう。
#include <iostream> #include <limits> #include <string> int main() { using limits = std::numeric_limits<float>; std::cout << std::to_string(limits::quiet_NaN()) << std::endl; std::cout << std::to_string(limits::infinity()) << std::endl; }
出力:
nan inf
エラーにはならず、NaNは"nan"という文字列に、infinityは"inf"という文字列になりました。
この関数の挙動は、sprintf()関数に依存しています。floatやdouble型なら、"%f"が使われます。そして、sprintf()の仕様もまた、fprintf()に依存していて、そこにNaNとinfinityの仕様について記載されています。
NaNは、"[-]nan"もしくは"[-]nan(n-char-sequence)"という形式(-は符号が付くかつかないか)、infinityは、"[-]inf"もしくは"[-]infinity"のどちらかが、実装定義によって決定し、返されます。