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

sprintf Форматированный вывод отрицательных чисел

6 минут назад, ToR_TDA сказал:

В какой момент происходит проблема? И почему я не вижу ее по показаниям?

Я не знаю что делает div() и какой формат её аргументов, и что такое div_t, поэтому не могу сказать.

Но подумайте, что будет если current==-32768  ?

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

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


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

 

37 минут назад, ToR_TDA сказал:

Если честно то не очень понял. Есть некоторое АЦП которое отдает мне данные так: 
32767 = 3,2767A
-32768 = -3,2768A 

При этом коду 0x0000 соответствует ток 0А. В какой момент происходит неправильная смена знака?

Если вы получили int16_t current = -32768, и попытаетесь сделать его положительным (current = -current),

то в current у вас останется -32768. Потому что максимальное положительное значение для int16_t равно 32767.

В вашем коде я сейчас не вижу смены знака, похоже, что вы просто отрезаете "минус" при форматировании. Тогда, скорее всего, ваш код покажет некорректные данные на значениях типа "-30.023" (будет печататься "-3.-02").

Вот, протестировал ваш код. при current = -30356 пишет:

I= --3.-35 A

 

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


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

15 minutes ago, jcxz said:

Я не знаю что делает div() и какой формат её аргументов, и что такое div_t, поэтому не могу сказать.

Да я тоже только узнал:pardon:https://ru.cppreference.com/w/cpp/numeric/math/div

25 minutes ago, jcxz said:

Но подумайте, что будет если current==-32768  ?

Понял, при -32768 на выходе будет -0.000

17 minutes ago, AHTOXA said:

Тогда, скорее всего, ваш код покажет некорректные данные на значениях типа "-30.023" (будет печататься "-3.-02").

Из того что я понял будет только одна проблемная точка это -32768.

 

1.jpg

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


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

15 минут назад, ToR_TDA сказал:

Из того что я понял будет только одна проблемная точка это -32768.

Видимо, реализация sprintf в вашем компиляторе отличается от стандартной. Потому что стандартная печатает для current = -30356 строчку

"I= --3.-35 A".

Вот ссылка, можете сами проверить.

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


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

2 minutes ago, AHTOXA said:

"I= --3.-35 A".

Каюсь, не всю программу выложил. Это связано было со способом приема данных с АЦП через 2 отдельных байта MSB и LSB.

int16_t current;
char sign;
div_t fracDigit;
char Str_Buffer[20];
int8_t MSB = 0x83;
uint8_t LSB = 0x00; //например -32000

current = abs (MSB << 8 | LSB);
if (MSB >= 0)  sign = ' ';
else           sign = '-';
fracDigit = div(current/10,1000);
sprintf(Str_Buffer, "I= %1c%1d.%03d A", sign, fracDigit.quot, fracDigit.rem);

 

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


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

2 hours ago, AHTOXA said:

Да, в этом случае опасно только одно значение -32768.

Так как у меня нет отдельной информации о переполнении АЦП, я назначу обе крайние точки 32767 и -32768 как "out of range".

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


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

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

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

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

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

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

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

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

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

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