NaNとinfinityの文字列化

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()関数に依存しています。floatdouble型なら、"%f"が使われます。そして、sprintf()の仕様もまた、fprintf()に依存していて、そこにNaNとinfinityの仕様について記載されています。

NaNは、"[-]nan"もしくは"[-]nan(n-char-sequence)"という形式(-は符号が付くかつかないか)、infinityは、"[-]inf"もしくは"[-]infinity"のどちらかが、実装定義によって決定し、返されます。

参照