Функция "abs" и "SoftwareSerial".

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015
[code]
//ide 1.6.6
//#include <SoftwareSerial.h>
//SoftwareSerial HC_12  (7, 6);//  RX, TX
   float  ftemp = 0;

   
void setup() {
        Serial.begin(9600); 
//        HC_12.begin(1200);
    

}

void loop() {
  ftemp = -1.9;
    Serial.print("a ");
    Serial.print(ftemp); 
    Serial.print("  ");
     ftemp = abs(ftemp);
      Serial.print("abs =  ");
      Serial.println(ftemp); 
   delay(3000);
//    HC_12.print("qw");
}
[/code]

Собственно вопрос.  В таком варианте скетча функция  "abs" возвращает 1.9, если раскоментировать стоки 3 и 4 

"abs" возвращает 1.0  почему? как это обойти.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Замени 20ю строку на 

 if (ftemp<0.0) ftemp = -ftemp;

и тебе станет пофик на SoftwareSerial. 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

DetSimen пишет:

Замени 20ю строку на 

 if (ftemp<0.0) ftemp = -ftemp;

и тебе станет пофик на SoftwareSerial. 

да так работает, а всё таки какая связь между  софт сериалом и abs?

 

  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Никакой.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

andriano пишет:

Никакой.

Понимаю что никакой, а почему влияет или это глюк IDE.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В программе глюков нет, она работает в точности так, как ее написал программист. А вот почему программист...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Почитали бы хоть учебник...
А конкретно , что там написано про abs(), все бы сразу прояснилось думаю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

oleg_kazakof пишет:

или это глюк IDE.

Да, глюк. Но он не в том, что с софт-сериалом работает неправильно (у меня, кстати, правильно в 1.8.12) а в том, что без него правильно.

По уму не должно, т.к. abs по уму - целочисленная вещь. Но многие реализаторы делают её типо-независимой.

oleg_kazakof пишет:
как это обойти.

Писать правильно. Если у Вас переменная типа float, то для неё нужно использовать fabs - и будет счастье :-)

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Всем спасибо.  Ориентировался на это

 

BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

Это где такие примеры интересные? Дайте ссылку почитать.  

Bruzzer
Offline
Зарегистрирован: 17.03.2020

В файле Arduino.h есть определения

#define abs(x) ((x)>0?(x):-(x))

А в файле SoftwareSerial.h есть отмена этого определения

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Bruzzer пишет:

В файле Arduino.h есть определения

#define abs(x) ((x)>0?(x):-(x))

Во-во! Оно "типонезависимое" и это не то, чтобы нарушение, но мелкое хулиганство.

Но fabs - он специально для float/double, поэтому юзайте его и не будет никаких граблей.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Bruzzer пишет:

В файле Arduino.h есть определения

#define abs(x) ((x)>0?(x):-(x))

Во-во! Оно "типонезависимое" и это не то, чтобы нарушение, но мелкое хулиганство.

Но fabs - он специально для float/double, поэтому юзайте его и не будет никаких граблей.

век живи век учись  )))