C ++: Что такое спецификация формата printf () для "float"? - PullRequest
7 голосов
/ 26 августа 2011

C ++: Что такое спецификация формата printf() для float?(Visual C ++)

Раньше я использовал %g для float и %lg для double.

Похоже, что спецификация изменилась, и float не определено, а double равно %g.

У меня есть биты в памяти, которые я печатаю, поэтому приведение не является вариантом.

Можно ли распечатать float значения, используя printf()?

Обновление:

Этот код был написан для единицытестирование общих библиотек C ++, используемых во встроенной системе.Вот что я должен был сделать, чтобы float заработал.Код в шаблонной функции:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ...

Вот фрагмент кода:

if (typeid(Ttyp) == typeid(float)) {    
    float64 c = *(float32*)&Tp(row,col);
    float64 a1 = *(float32*)&Arg1(row,col);
    float64 a2 = *(float32*)&Arg2(row,col);
    float64 e = *(float32*)&Exp(row,col);
    m_b = (c == e);
    _snprintf(m_acDiag, sizeof(m_acDiag)-1
        , "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s"
        , a1, a2, e, c, BOOL_PF(m_b));
} else {
    ...

Довольно уродливо, не так ли?Использование поплавков в качестве аргументов дает плохой результат.Может быть из-за использования _snprintf()?Несколько лет назад я бы использовал %lg, и все было бы в порядке.Больше нет.

Ответы [ 6 ]

17 голосов
/ 26 августа 2011

double и float используют одинаковые спецификаторы формата с printf (%a, %e, %f и %g). Это потому, что printf - это функция с переменным числом. Любые аргументы с плавающей точкой неявно повышаются до удвоения перед вызовом; вы не можете передать поплавок на printf.

4 голосов
/ 26 августа 2011

К вопросу в заголовке: нет / "% f"

К вопросу в теле сообщения: Да и нет.

printf - это функция с переменным числом.Все float аргументы автоматически повышаются до double s.Вы печатаете число с плавающей точкой, передавая его в printf, но фактически оно не достигает функции printf.

3 голосов
/ 26 августа 2011

%g всегда был правильным форматом для чисел с плавающей точкой или двойных (поскольку аргументы с плавающей точкой повышаются до двойного для переменных функций, таких как printf).

%lg был добавлен как синоним для %g (в C99 я не знаю, когда или C ++ его принял), вероятно, для лучшей симметрии с семейством *scanf.

$Lg для длинных двойных.

Вы можете заменить g на f или e в зависимости от того, какой формат вывода вы хотите.

2 голосов
/ 26 августа 2011

Другие указали формат для печати с плавающей точкой, используя printf, но, поскольку вы используете C ++, я предлагаю полностью этого избежать.

Вместо этого используйте потоки C ++, у вас нетбеспокоиться о спецификаторах формата тогда.Это также тип safe, в то время как printf - нет.

#include <iostream>

int main()
{
  float f = 1.234;
  std::cout << f << std::endl;
}

Если у вас есть массив байтов, содержащий число с плавающей запятой, memcpy поместите его в переменную типа float и используйте приведенный выше код.

2 голосов
/ 26 августа 2011

От: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

% f Десятичное число с плавающей запятой 392.65

1 голос
/ 26 августа 2011
printf("float: %f", floatValue);

или, если вы хотите экспоненциальную запись:

printf("float: %e", floatValue);
...