Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: codesourcery printf %lf %Lf
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
sergey sva
В чем может быть дело sprintf не выводит double, float выводит нормально указывал %Lf %LF %lf всегда выводит только 4 байта а не 8 как должен?
В переменной double 50.5 если по байтам 0 0 0 0 0 64 73 64.
Сергей Борщ
Цитата(sergey sva @ Oct 22 2015, 21:13) *
указывал %Lf %LF %lf всегда выводит только 4 байта а не 8 как должен?
Lf должен выводить long double. double выводит %f. float при передаче в функцию с переменным числом параметров приводится к double. По-умолчанию %f выводит 6 знаков после запятой. https://ru.wikipedia.org/wiki/Printf
sergey sva
Пробовал и так тоже %f выводит 0.000000 . Переменной непосредственно перед sprintf присваиваю 50.5 Посмотрел отладчиком память там 8 байт = 0 0 0 0 0 64 73 64
Aaron
здесь был написан бред
А если %5.5f вывести? 5 знаков до запятой, 5 - после должен выводить...

реализация printf считает, что лишние нули можно откинуть?

Код
void printdouble(void)
{
    union {
        uint8_t u8[8];
        double d;
    };

    u8[0] = 1;
    u8[1] = 0;
    u8[2] = 0;
    u8[3] = 0;
    u8[4] = 0;
    u8[5] = 64;
    u8[6] = 73;
    u8[7] = 64;

    printf("u8[]: ");
    for (int i = 0; i < 8; i++) {
        printf("%02X ", u8[i]);
    };
    printf(" \r\n");

    printf("double auto: %f\r\n", d);
    printf("double 2.6: %2.5f\r\n", d);
    printf("double 2.16: %2.16f\r\n", d);
}
sergey sva
У меня выводит только если double привести к float printf("double auto: %f\r\n", (float)d); Так не хотелось бы если значение будет больше float будет неправильно отображаться ((
Aaron
то есть u8[0] = 1; ... printf("double 2.16: %2.16f\r\n", d); - не показывает длинную дробь? всё по нулям?? реализация ftoa кривая!
megajohn
еще вариант, для работы с double и long long нужно выравнивание стека на 8. Это тут обсуждалось много раз и сам натыкался на странный printf в IAR
AlexandrY
Цитата(sergey sva @ Oct 22 2015, 21:13) *
В чем может быть дело sprintf не выводит double, float выводит нормально указывал %Lf %LF %lf всегда выводит только 4 байта а не 8 как должен?
В переменной double 50.5 если по байтам 0 0 0 0 0 64 73 64.


В линкере надо проверить стоят ли флаги -specs=nano.specs -specs=nosys.specs -u _printf_float
С такими флагами у Cross ARM C Linker оператор printf со спецификатором %0.60f выдает после запятой 49 ненулевых цифр для double и 23 для float

Только что проверил.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.