Поэтому я хочу использовать printf для выравнивания столбцов, но printf не может печатать двойные числа, которые нуждаются в научной записи. Это просто выходит как 0, но с cout это выходит хорошо. ‘in’ и ‘fn’ являются структурами; x » y ‘и’ z ‘являются двойными
Код
printf("Facet Normal: %lf %15lf %15lf\n", in->fn.x, in->fn.y, in->fn.z);
cout << "cout test: " << in->fn.x << endl;
Выход
Facet Normal: -0.000000 -0.894426 0.447215
cout test: -9.6137e-08
Я не могу заставить printf работать правильно. У меня была вся функция, работающая корректно с cout, но, как я уже сказал, я бы хотел, чтобы все выстроилось в ряд.
Редактировать:
Как сказал Оли, использование% e заставляет его печатать правильно. Использование% e повсеместно, хотя оно помещает все в научную нотацию, и многие цифры в наборе данных в действительности не нуждаются в этом. Кажется, Cout конвертируется между% lf и% e по мере необходимости. Есть ли простой способ заставить printf получить такое поведение?
Ответ:
% f как для чисел с плавающей точкой, так и для двойных (поскольку аргументы с плавающей точкой увеличиваются до двойных);
% lf для длинных двойных. f печатает без показателя степени, e печатает с показателем степени и
g использует тот, который выглядит лучше (следуя определенным правилам).
— Кит Томпсон
% g получает точное поведение, которое я искал!
Кажется, вы хотите получить «лучшее» форматирование (по умолчанию для std::ostream
): ты можешь использовать %g
(%Lg
за long double
) чтобы функция форматирования решала, как следует форматировать значения. Существует четыре спецификатора формата:
%f
для записи с фиксированной точкой (формат, используемый std::fixed
для потоков).%e
для научного форматирования (формат, используемый std::scientific
для потоков).%g
для «лучшей» версии исправленной и научной (по умолчанию для потоков и начиная с C ++ 11 std::defaultfloat
).%a
для точного / шестнадцатеричного представления числа с плавающей запятой (начиная с C ++ 11 std::hexfloat
).Флаги форматирования могут использоваться как в нижнем, так и в верхнем регистре, чтобы указывать, должны ли какие-либо символы быть строчными или прописными (например, e
против E
). Обратите внимание, что l
Спецификатор длины на самом деле не имеет отношения к форматированию с плавающей точкой. Возможно, вам придется использовать L
Впрочем, при форматировании long double
Как std::printf()
ссылка говорит, просто используйте %e
:
std::printf( "One double in decimal scientific notation! %e" , my_double );
Но правильный путь C ++ — это использовать std::cout
и некоторые манипуляторы, std::scientific
в этом случае:
std::cout << "One double in decimal scientific notation!" << std::scientific << my_double;
Обратите внимание, что формат std::cout
формирует часть его состояния, то есть вам нужно настроить его только один раз, формат применяется к любой операции вывода после настройки и перед другим изменением формата:
std::cout << std::scientific;
std::cout << std::pow( 10.0 , 10.0 ) << std::endl;
std::cout << std::pow( 10.0 , 20.0 ) << std::endl;
std::cout << std::pow( 10.0 , 30.0 ) << std::endl;
1e11
1e21
1e31
Если вы хотите контролировать вывод из std :: cout, используйте setw () и setfill ().
http://www.cplusplus.com/reference/iomanip/setw/
Вы также можете установить точность и т. Д. Я оставлю это вам для изучения.