Перейти к содержанию
    

Можно ли настроить printf без включения double?

Можно ли настроить printf без включения double?

 

Есть кейл микровижн, cortex-m0. Все равно есть плавучка в математике, на индикатор надо выводить плавучку. Сейчас все нормально работает и с притянутыми printfa.o double. Но можно ли в принципе настроить встроенный printf на использование только float?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно, если такая возможность есть - она описана в документации на ваш компилятор. Чтение документации из интернета вслух - не менее 100 евро в час.

 

P.S. Но вообще-то, по стандарту, при передаче в функцию с переменным числом аргументов float неявно приводится к double. Так что если ваш компилятор соответствует стандарту, то заставить его printf внутри работать с float вместо double не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно, если такая возможность есть - она описана в документации на ваш компилятор. Чтение документации из интернета вслух - не менее 100 евро в час.

 

P.S. Но вообще-то, по стандарту, при передаче в функцию с переменным числом аргументов float неявно приводится к double. Так что если ваш компилятор соответствует стандарту, то заставить его printf внутри работать с float вместо double не получится.

 

Спасибо, Сергей. Я видел ваш пост по этой теме ранее и посмотрел хидеры printf. Понял что есть выбор только между целочисленным printf и double. Была надежда, что где-то затаился printf с float.

Изменено пользователем Михась

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, Сергей. Я видел ваш пост по этой теме ранее и посмотрел хидеры printf. Понял что есть выбор только между целочисленным printf и double. Была надежда, что где-то затаился printf с float.

 

Для информации будущим исследователям

МК -STM32f030, индикатор - LCD TIC-55, softspi. Частота тактовая - 8МГц

 

Строка форматируется из

sprintf(s_temp, "%4.1f%5d", (float)A, B);

Время на функцию включая вывод softspi - 2.2ms

 

sprintf(s_temp, "%2d %5d", A, B );

Время на функцию включая вывод softspi - 0.9ms

 

Время чистого вывода на индикатор по softspi -0.4ms

 

Библиотеки (float используется и в других функциях, double - только printf)

Оптимизация отключена. Стека в 256 байт не хватило (без printf с double хватало 256), пришлось увеличить до 512.

 

    ----------------------------------------------------------------------

     Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Member Name

       34          0          0          0          0         60   fpclassifyf.o
       62          0          0          0          0        340   funder.o
     1520         90        320          0          0        176   powf.o
        0          0          0          0          0          0   entry.o
        0          0          0          0          0          0   entry10a.o
        0          0          0          0          0          0   entry11a.o
        8          4          0          0          0          0   entry2.o
        4          0          0          0          0          0   entry5.o
        0          0          0          0          0          0   entry7b.o
        0          0          0          0          0          0   entry8b.o
        8          4          0          0          0          0   entry9a.o
       12          6          0          4          0         60   errno.o
       30          0          0          0          0          0   handlers.o
       40          0          0          0          0         72   idiv.o
       36          8          0          0          0         68   init.o
        0          0          0          0          0          0   iusefp.o
       32          0          0          0          0         68   llshl.o
       38          0          0          0          0         68   llsshr.o
       34          0          0          0          0         68   llushr.o
     2242         94          0          0          0        472   printfa.o
       36         12          0          4          0        120   rand.o
       44          0          0          0          0         72   uidiv.o
       96          0          0          0          0         84   uldiv.o
       40          2          0          0          0         68   cdrcmple.o
      356          4          0          0          0        140   dadd.o
      240          6          0          0          0         84   ddiv.o
      236          0          0          0          0        216   depilogue.o
       64         10          0          0          0         68   dfixul.o
      208          6          0          0          0         88   dmul.o
       40          0          0          0          0         60   f2d.o
      178          0          0          0          0        108   fadd.o
      124          0          0          0          0         72   fdiv.o
      130          0          0          0          0        144   fepilogue.o
       50          0          0          0          0         60   ffixi.o
       76          0          0          0          0         68   ffixir.o
       40          0          0          0          0         60   ffixui.o
       22          0          0          0          0         68   fflti.o
       14          0          0          0          0         68   ffltui.o
      122          0          0          0          0         72   fmul.o
       24          0          0          0          0         60   fscalb.o

   ----------------------------------------------------------------------
     6242        246        320          8          0       3232   Library Totals
        2          0          0          0          0          0   (incl. Padding)

Изменено пользователем Михась

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для информации будущим исследователям

МК -STM32f030, индикатор - LCD TIC-55, softspi. Частота тактовая - 8МГц

 

Если вам очень надо, то скачайте в Keil-е Kinetis SDK , там в директории RTOS/MQX/MQX_STDLIB будут исходники всех стандартных библиотек C

Там найдете и _io_doprint, которое ядро всех print-ов.

Небольшие исправление и оно будет вам печатать только float.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если так:

 

int i = (int)(A*10.0);

 

sprintf(s_temp, "%4d.%.1d %5d", i/10, i%10, B );

 

Я, как умная маша, с этого и начал. Но уже есть с десяток "экранов" на каждый выводится 1-2 параметра со знаками, и эти параметры еще масштабировать, т.к. положение точки надо двигать в зависимости от места на экране под число. Я осатанел с проверками за три дня и перешел на флоат. Пара килобайт не стоят инсульта. :)

 

Это не говоря о том, что попробуйте вывести в свой пример отрицательное число. Минус будет показывать в каждой позиции под число.

Изменено пользователем Михась

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкинуть стандартный принтф и заменить его собственным, а там уже отключайте и включайте все что угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...