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"
のどちらかが、実装定義によって決定し、返されます。