Использование atof для целого числа

Я унаследовал некоторый код (от кого-то, кто ушел) и нашел этот маленький фрагмент:

double minX = xVal.find('.') == string::npos ? (double)atoi(xVal.c_str()) : atof(xVal.c_str());
double minY = yVal.find('.') == string::npos ? (double)atoi(yVal.c_str()) : atof(yVal.c_str());

Есть ли какая-то причина, почему он решил использовать atoi для целочисленных типов? Я не вижу проблемы с:

double minX = atof(xVal.c_str());
double minY = atof(yVal.c_str());

Благодарю.

0

Решение

Нет причин. Эти троичные операторы являются дополнительными.
Но его лучше использовать strtod вместо этого atof — atof не обнаруживает ошибки переполнения и ошибки переполнения.

1

Другие решения

На самом деле вы не должны использовать ни atoi, ни atof. Они оба устарели и были заменены на strtol и strtof соответственно.

3

Его код был:
double minX = (double) atoi (xVal.c_str ());

Затем он понял, что float существует, и адаптировал код, не задумываясь.

0

Возможно, он был введен в заблуждение именем atof, и он забыл, что оно возвращает двойное число, а не число с плавающей запятой. Если atof вернул число с плавающей точкой, то для целочисленных значений может произойти некоторая потеря точности. Например, на моем компьютере:

char buffer[20];
itoa(INT_MAX-113, buffer, 10);
double minXF = (float)atof(buffer);
double minXI = (double)atoi(buffer);
std::cout << (int)minXF << std::endl;
std::cout << (int)minXI << std::endl;

Возвращает:

2147483520
2147483534

Однако, поскольку atof возвращает double, это все не имеет значения, и нет реальной причины использовать atoi. Поэтому используйте безопасные эквиваленты в соответствии с другими ответами и, возможно, допросите оригинального автора об этом, если вам доведется увидеть его на обеде.

0