iostreamとVisual C++を使用して、テキストファイルのNaN値を読み書きする必要があります。 NaN値を書くとき、私は1.#QNAN
を得ます。しかし、それを読み取って、1.0
を出力します。Visual C++を使用したNaN ASCII I/O
float nan = std::numeric_limits<float>::quiet_NaN();
std::ofstream os("output.txt");
os << nan ;
os.close();
出力は1.#QNAN
です。
std::ifstream is("output.txt");
is >> nan ;
is.close();
nan
1.0
に等しいです。 awoodlandにより示唆されるように
ソリューション
は最後に、私はこのソリューションを作ってみました。私はNaNの文字列表現として "nan"を選択しました。 < <と>>演算子は両方ともオーバーライドされます。
using namespace ::std;
class NaNStream
{
public:
NaNStream(ostream& _out, istream& _in):out(_out), in(_in){}
template<typename T>
const NaNStream& operator<<(const T& v) const {out << v;return *this;}
template<typename T>
const NaNStream& operator>>(T& v) const {in >> v;return *this;}
protected:
ostream& out;
istream& in;
};
// override << operator for float type
template <> const NaNStream& NaNStream::operator<<(const float& v) const
{
// test whether v is NaN
if(v == v)
out << v;
else
out << "nan";
return *this;
}
// override >> operator for float type
template <> const NaNStream& NaNStream::operator>>(float& v) const
{
if (in >> v)
return *this;
in.clear();
std::string str;
if (!(in >> str))
return *this;
if (str == "nan")
v = std::numeric_limits<float>::quiet_NaN();
else
in.setstate(std::ios::badbit); // Whoops, we've still "stolen" the string
return *this;
}
最小限の動作例:有限浮動小数点数とNaNがストリングストリームに書き込まれ、次に読み戻されます。 std::ostream
にfloat
又はdouble
値を印刷する場合
int main(int,char**)
{
std::stringstream ss;
NaNStream nis(ss, ss);
nis << 1.5f << std::numeric_limits<float>::quiet_NaN();
std::cout << ss.str() << std::endl; // OUTPUT : "1.5nan"
float a, b;
nis >> a; nis >> b;
std::cout << a << b << std::endl; // OUTPUT : "1.51.#QNAN"
}
質問は、「NaNでフォーマットされたI/Oを実行する方法」です。私は考えます。良い質問。 –
http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.htmlは、関数のfprintf()ファミリが無限大とNaN(浮動小数点形式でエンコードされた記号エンティティ)の文字列表現を生成する場合、 IEEE Std 754-1985をサポートしていれば、fscanf()関数ファミリは、その値が何であれ、それらを入力として認識します。 –
@Moo:もしそれが本当であれば、少なくとも私たちはiostreamが 'fscanf'を使わないことを知っています:-)どんな場合でも、NaNのテキスト表現はコンパイラからコンパイラ、そしておそらく州から州にも及んでいます。たぶん* NaNを読むことができないかもしれません。 –