Ошибка умножения ардуино

Например, Arduino не может умножать числа от 40 на 1000.

void setup() {
  Serial.begin(9600);
}

void loop() {
    float a = 60 * 1000;
    Serial.print(a);
}

результат -5536 .-. ??? какая ??

Мне нужно перевести секунды в миллисекунды, но я не знаю альтернатив умножению на 1000


person Marco Ferraioli    schedule 17.07.2014    source источник


Ответы (2)


Проблема в том, что вы

  1. взять (подписанный) int и установить его на 60
  2. взять (подписанный) int и установить его на 1000
  3. умножая их, получая подписанный int. Это создает переполнение, поэтому результат равен -5536.
  4. преобразование этого числа в число с плавающей запятой; -5536 -> -5536,0

Решение? Поскольку вы хотите иметь дело с поплавками... Работайте с поплавками!

float a = ((float)60) * 1000;
float a = 60.0 * 1000;

Два решения одинаковы; первый преобразует (int)60 в число с плавающей запятой, затем умножает его на (int)1000, что дает вам (float)60000. Второй сообщает компилятору, что 60.0 — это число с плавающей запятой.

В обоих случаях число с плавающей запятой, умноженное на целое число, дает число с плавающей запятой, так что... Никакого переполнения!

person frarugi87    schedule 17.07.2014
comment
Ах да, легко забыть, что целые константы по умолчанию имеют 16-битный знак: arduino.cc/en/ Ссылка/целочисленные константы - person jdr5ca; 19.07.2014

Проблема в том, что Serial.print преобразует a в целое число со знаком. Попробуй это:

Serial.print((float)a);

или это:

#include "floatToString.h"
char buffer[25];
Serial.print(floatToString(buffer, a, 5));
person kirill    schedule 17.07.2014