2016-10-06 9 views
2

私は文字列からフロートを読んでいます。彼らはとてもstof、strtofは決定的ですか?

float f1 = strtof("999999999999.16"); 
float f2 = stof("000999999999999.1600000"); 
assert(f1 == f2); 

私はアサーションは、常に先頭と末尾のゼロの関係なくtrueになりますことを確認することができ、様々な形式で書くことができますか?セパレータは常にドットになります。stofはコンマを処理しません。

+0

100%確かではありません。 'stof'は' strtod'を内部的に呼び出すので、違いがあるかどうかわかりません。 C++ 17では 'strtof'を内部的に呼び出すので、保証する必要があります。 – NathanOliver

+0

私は100%確かではありません。私はこの質問には標準の参照が必要だと思います。 @SnoopDogの答えは、予想以上のものではありません。 – Bathsheba

答えて

2

The C11 standard, in 7.22.1.3p9、これについて述べているCのstrtof/strtod/strtold(C++バージョンは、少なくともcppreferenceから判断し、下に使用するものであるべきである):対象配列は、小数点形式を有する場合

DECIMAL_DIG<float.h>で定義されています)の有効数字の場合、結果は正しく丸められます。

は、あなたのコード行の両方が有効桁数が同じことを考えると、彼らは 同じように動作する必要があります。しかし、これは単にスタンダードが「有効数字」を全く言及していないという事実に基づいた単なる推測にすぎない。他のどこにも言及されておらず、標準では、先頭に(小数点の前に)、または末尾に(小数点の後に)ゼロが明示されていません。

+0

あなたは両方とも 'strtof'を使用していますか? cplusplusは 'strtod'を使って' stof'を言いますが、 'stof'には何もありません。 – user463035818

+0

@ tobi303 [cppreference](http://en.cppreference。com/w/cpp/string/basic_string/stof)は、 '_underlying function_ 'として' strtof'を記述しています(脚注にありますが、より良い参照はありません)。 – mindriot

+0

@mindriot 'stof'はC++ 17まで' strtod'を呼び出し、 'strtof'を呼び出します。 – NathanOliver

1

C++ 14(§21.5)標準状態:

float stof(const string& str, size_t* idx = 0);

double stod(const string& str, size_t* idx = 0);

long double stold(const string& str, size_t* idx = 0);

効果:最初の2つの関数はstrtod(str.c_str(), ptr)を呼び出して、第三の機能がstrtold(str.c_str(), ptr)を呼び出し。各関数は、変換された結果があればそれを返します。引数ptrは、*idxに格納するものを決定するために使用される関数の内部オブジェクトへのポインタを指定します。関数が例外をスローしないで、idx != 0の場合、関数はstrの最初の未変換要素のインデックスを*idxに格納します。

したがって、多くの場合、それらは同じになりますが、中間のdoubledouble roundingの可能性を開きます。例えば。最も近いdoubleが正確途中1.0f1.0000001fなど後続の変換の間float1.0fに切り捨てますあるのに対しstr = "1.0000000596046448"場合、最も近いfloatは(算術IEEE754を想定)、1.0000001fあります。

これは少なくとも理論です。実際には、私はこれを再現することができません:http://ideone.com/NMRy14

関連する問題