C ++ printf печать удваивается читает как 0

Поэтому я хочу использовать 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 получает точное поведение, которое я искал!

1

Решение

Кажется, вы хотите получить «лучшее» форматирование (по умолчанию для std::ostream): ты можешь использовать %g (%Lg за long double) чтобы функция форматирования решала, как следует форматировать значения. Существует четыре спецификатора формата:

  1. %f для записи с фиксированной точкой (формат, используемый std::fixed для потоков).
  2. %e для научного форматирования (формат, используемый std::scientific для потоков).
  3. %g для «лучшей» версии исправленной и научной (по умолчанию для потоков и начиная с C ++ 11 std::defaultfloat).
  4. %a для точного / шестнадцатеричного представления числа с плавающей запятой (начиная с C ++ 11 std::hexfloat).

Флаги форматирования могут использоваться как в нижнем, так и в верхнем регистре, чтобы указывать, должны ли какие-либо символы быть строчными или прописными (например, e против E). Обратите внимание, что l Спецификатор длины на самом деле не имеет отношения к форматированию с плавающей точкой. Возможно, вам придется использовать LВпрочем, при форматировании long double

2

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

Как 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

2

Если вы хотите контролировать вывод из std :: cout, используйте setw () и setfill ().
http://www.cplusplus.com/reference/iomanip/setw/

Вы также можете установить точность и т. Д. Я оставлю это вам для изучения.

0
По вопросам рекламы [email protected]