реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> codesourcery printf %lf %Lf
sergey sva
сообщение Oct 22 2015, 18:13
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



В чем может быть дело sprintf не выводит double, float выводит нормально указывал %Lf %LF %lf всегда выводит только 4 байта а не 8 как должен?
В переменной double 50.5 если по байтам 0 0 0 0 0 64 73 64.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 22 2015, 19:10
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 22 2015, 19:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Пробовал и так тоже %f выводит 0.000000 . Переменной непосредственно перед sprintf присваиваю 50.5 Посмотрел отладчиком память там 8 байт = 0 0 0 0 0 64 73 64
Go to the top of the page
 
+Quote Post
Aaron
сообщение Oct 23 2015, 06:26
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



здесь был написан бред
А если %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);
}


Сообщение отредактировал Aaron - Oct 23 2015, 06:39
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 23 2015, 07:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



У меня выводит только если double привести к float printf("double auto: %f\r\n", (float)d); Так не хотелось бы если значение будет больше float будет неправильно отображаться ((
Go to the top of the page
 
+Quote Post
Aaron
сообщение Oct 23 2015, 07:25
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



то есть u8[0] = 1; ... printf("double 2.16: %2.16f\r\n", d); - не показывает длинную дробь? всё по нулям?? реализация ftoa кривая!
Go to the top of the page
 
+Quote Post
megajohn
сообщение Oct 23 2015, 07:35
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



еще вариант, для работы с double и long long нужно выравнивание стека на 8. Это тут обсуждалось много раз и сам натыкался на странный printf в IAR


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Oct 23 2015, 07:55
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(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

Только что проверил.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 23:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.17104 секунд с 7
ELECTRONIX ©2004-2016