ищу snprintf () - замена - PullRequest
       13

ищу snprintf () - замена

0 голосов
/ 08 мая 2018

Я хочу преобразовать число с плавающей запятой (например, f = 1.234) в массив символов (например, s = "1.234").Это довольно просто с snprintf(), но по некоторым размерам и причинам производительности я не могу его использовать (это встроенная платформа, где snprintf() слишком медленный, потому что он использует удваивается внутри).

Итак:Как я могу легко преобразовать число с плавающей точкой в ​​массив символов (положительные и отрицательные числа с плавающей запятой, без экспоненциального представления, максимум три цифры после точки)?

Спасибо!

PS: уточнить это:платформа поставляется с NEON FPU, который может выполнять 32-битные операции с плавающей запятой в аппаратном обеспечении, но медленен с 64-битными двойными числамиК сожалению, C-библиотека для этой платформы не имеет конкретного варианта NEON / float snprintf, поэтому мне нужна замена.Кроме того, полный набор snprintf / printf-вещи слишком сильно увеличивает размер кода

1 Ответ

0 голосов
/ 08 мая 2018

Для многих микроконтроллеров доступна упрощенная функция printf без поддержки float / double. Например, многие платформы имеют инструменты Newlib Nano и Texas Instruments ustdlib.c.

С помощью одной из этих не-плавающих функций printf вы можете разделить печать на что-то, используя только целые числа, такие как

float a = -1.2339f;
float b = a + ((a > 0) ? 0.0005f : -0.0005f);
int c = b;
int d = (int)(b * 1000) % 1000;
if (d < 0) d = -d;
printf("%d.%03d\n", c, d);

который выводит

-1.234

Остерегайтесь переполнения целого числа на 8- и 16-битных платформах.

-edit- Кроме того, как отмечается в комментариях, случаи округления углов дадут разные ответы, чем реализация printf.

...