Проблемы с математикой
- Войдите на сайт для отправки комментариев
Втр, 09/08/2016 - 02:01
Собираю устройство на Pro Mini. ATMega 162. вот текст программы. когда смотрю данные в мониторе то до числа а=325 все считает правильно. как только превышает 325 умножает на неизвестно что, в итоге сумма значительно превышает ожидаемую. не пойму в чем может быть проблема? знатоки-подскажите
int PerPin = A0; int OutPin = 12; int a; long T; void setup() { Serial.begin(115200); pinMode(OutPin, OUTPUT); pinMode(PerPin, INPUT); } void loop() { a = analogRead(PeriodPin); T= (a*100)+10; Serial.println(a); Serial.println(T); }
ну.
не ясно, что там у тебя умножает, если скетч у тебя нерабочий и не понятно, что он делает.
32 800 не влазит в 16-битную знаковую, надо декларировать как
long a;
32 800 не влазит в 16-битную знаковую, надо декларировать как
long a;
дык, у него же а никогда не превышает 1023, т.к. a = analogRead
32 800 не влазит в 16-битную знаковую, надо декларировать как
long a;
дык, у него же а никогда не превышает 1023, т.к. a = analogRead
а он на 100 умножает, вот и получится 328 от аналог-рида х 100
32 800 не влазит в 16-битную знаковую, надо декларировать как
long a;
дык, у него же а никогда не превышает 1023, т.к. a = analogRead
а он на 100 умножает, вот и получится 328 от аналог-рида х 100
я к тому, что не декларировать, а преобразовывать во время вычисления int в long - long(a)
иначе, додекларируемся, что все переменные придётся декларировать как long, если результатом вычисления потребуется long, но фактически величины переменных будут на порядки меньше.
иначе, додекларируемся, что все переменные придётся декларировать как long, если результатом вычисления потребуется long, но фактически величины переменных будут на порядки меньше.
кастинг, да возможно, но правильно будет (long) a * 100
смотрю данные в мониторе
Боюсь, что либо Вы запускаете другой скетч, либо просто троллите нас. Этот скетч не компилируется и, соответсвенно, ни в какой монитор ничего выводить не может. Всё, чо Вы можете увидеть с этим скетчем, это скромное сообщение "error: 'PeriodPin' was not declared in this scope"
спасибо всем неравнодушным! извиняюсь за ошибку в скетче. писал поздно. не заметил изменений в 15 строке. но это просто опечатка а не троль.. помог совет MagicianT, но не понятно чем ардуине моя математика не понравилсь? хотелось бы понять. все таки а это же int a не long. когда смотрел в мониторе a больше чем 1023 не было
int
Описание типа данных
Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. intзанимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)
long
Описание типа
Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647.long занимает 4 байта в памяти.
int
Описание типа данных
Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. intзанимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)
long
Описание типа
Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647.long занимает 4 байта в памяти.
в процессе возник еще вопрос. почему при такой записи дробная часть всегда равно 0?
вопрос решил сам. видать дело в синтаксисе
"как только превышает 325 умножает на неизвестно что"
сколько будет 328*100+10???
"как только превышает 325 умножает на неизвестно что"
сколько будет 328*100+10???
видать дело в синтаксисе
Да, нет, не в нём.
в процессе возник еще вопрос. почему при такой записи дробная часть всегда равно 0?
а если так
или так
видать дело в синтаксисе
Да, нет, не в нём.
то работает, а если Т=а/1000 то дробная часть .00 . в чем принципиальная разница?
то работает, а если Т=а/1000 то дробная часть .00 . в чем принципиальная разница?
В семнатике операций, а не в синтаксисе.
А вообще, прочитайте какую-нибудь книжку по языку на котором пытаетесь писать, сразу жить легче станет.
книжки нет а вот брошюру читал. ну и кроме общих формулировок хотелось бы что то по конкретнее
http://arduino.ru/Reference/Float
Пример использования в коде
z = (
float
)x / 2.0;
// z равна .5 (следует использовать 2.0, а не 2)
книжки нет
http://www.programming1189.ru/files/Kern_Ritch.pdf
книжки нет
http://www.programming1189.ru/files/Kern_Ritch.pdf