Столкнулся с одной проблемой, но пока писал сюда, разобрался.
Сегодня запустил в Linux ранее написанную небольшую утилитку (писал в Windows с использовванием MinGW64). При это заметил, что вывод результата крайне странный: результат функции класса почему-то выводится в «hex». Сначала решил, что может чего намудрил внутри функции, но в ней число вычислялось нормально. Методом «научного» тыка выяснил, что проблема связана с std::cout.setf, так как в процессе вывода данных я, в зависимости от потребностей, меняю формат вывода.
Набросал небольшой пример, который демонстрирует проблему:
#include <iostream>
/* g++ -Wall -std=c++11 ./main.cpp */
int main() {
double test_d = -0.0010532140082682021;
std::cout.setf(std::ios::scientific);
std::cout << "test_d = " << test_d << std::endl;
std::cout.setf(std::ios::fixed);
std::cout << "test_d = " << test_d << std::endl;
return 0;
}
Можно и без -std=c++11
, результат вывода тот же:
test_d = -1.053214e-03
test_d = -0x1.1417fee28283fp-10
вместо второго числа ожидается -0.001053
.
Ну так вот, как оказалось, просто переключиться на fixed формат недостаточно, так как scientific при это не отключается, а в сочетании с ним, результат будет выводиться в HEX (http://en.cppreference.com/w/cpp/io/ios_base/setf):
scientific - generate floating point types using scientific notation,
or hex notation if combined with fixed: see std::scientific
то есть перед вызовом std::cout.setf(std::ios::fixed)
нужно сначала вызвать
std::cout.unsetf(std::ios::scientific);
Осталось понять, почему в MinGW64 (не помню какой версии), работает иначе.