В 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);
эффекты: первые две функции называют strtod(str.c_str(), ptr)
и третья функция вызывает strtold(str.c_str(), ptr)
, Каждая функция возвращает преобразованный результат, если таковой имеется. Аргумент ptr
обозначает указатель на объект, внутренний для функции, который используется для определения того, что хранить в *idx
. Если функция не генерирует исключение и idx != 0
, функция сохраняет в *idx
индекс первого неотвержденного элемента str
.
Во многих случаях, следовательно, они будут такими же, но промежуточный double
действительно открывает потенциал для double rounding. Например. если str = "1.0000000596046448"
, то ближайший float
(при условии, IEEE754 арифметического) является 1.0000001f
, в то время как ближайший double
точно на полпути между 1.0f
и 1.0000001f
, так и последующим превращением в float
будет округлить до 1.0f
.
Это, по крайней мере, теория. На практике, однако, я не могу воссоздать это: http://ideone.com/NMRy14
Не уверен на 100%. 'stof' вызывает' strtod' внутри, поэтому я не знаю, будет ли это иметь значение или нет. В C++ 17 он будет называть 'strtof' внутренне, поэтому он должен быть гарантирован. – NathanOliver
Я тоже не уверен на 100%. Я думаю, что этот вопрос требует ссылки на стандарты. Ответ @SnoopDog, поскольку он стоит, должен рассматриваться как нечто большее, чем предположение. – Bathsheba