atof случайно не работает исправление
Кажется, у меня есть странная проблема с функцией atof(), которая неправильно преобразовывает некоторые значения. При тех же значениях atoi() работает отлично.
Вот небольшой фрагмент того, что я делаю:
...
// frequencies is a std::string in format a10d50f20 etc. i.e. letter|frequency in %
// 6 - 48 characters, always correctly formatted
for (size_t i = 0; i < frequencies.size(); i+=3)
{
// #1
double percentage = atof(frequencies.substr(i+1, i+2).c_str()) / 100;
// #2
double percentage = static_cast<double>(atoi(frequencies.substr(i+1, i+2).c_str())) / 100;
cout << frequencies[i] << " - " << percentage << endl;
}
...
По какой-то странной причине только метод № 2, кажется, всегда работает правильно.
Примеры выходов
ЗА: частоты = "a30b30c40"
Оба метода работают правильно, давая мне:
а - 0,30
б - 0,30
с - 0,40
ЗА: частоты = "a10b10c10d10e10f50"
с помощью atof() я получаю:
а - 0,10
б - 0,10
с - 1000000000.00 !?
d - 1000000000.00 !?
е - 0,10
f - 0,50
в то время как atoi() правильно дает мне это:
а - 0,10
б - 0,10
с - 0,10
д - 0,10
е - 0,10
f - 0,50
ps я не могу использовать std:: stod, потому что mingw...
2 ответа
Второй аргумент substr
это длина, а не смещение.
Когда вы звоните substr(i+1, i+2)
за d
вы получаете весь остаток строки, который затем анализируется как экспоненциальная запись 10e10
т.е. 10 * 1010.
За d
atof
функция взяла 10e10
как 10 x (10 ^ 10) = 1000000000.0 (в инженерной нотации / стандартной форме).
Вы действительно получили 1000000000.0 за c
? Я не знаю, произошло ли то же самое.