2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1 ... 6, 7, 8, 9, 10
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 12:19 


27/08/16
10195
EUgeneUS в сообщении #1293376 писал(а):
Может какие-то особенности ардуиновского компилятора, не знаю. Прописал явное преобразование типов и всё заработало.
Это особенности ардуиновских библиотек:
Код:
  if (number > 4294967040.0) return print ("ovf");  // constant determined empirically
  if (number <-4294967040.0) return print ("ovf");  // constant determined empirically

У вас скорее всего ещё и петля обратной связи становится неустойчивой. Эти числа чуть меньше $2^{32}$ и очень странно, что при умножении "небольшого по модулю" целого 32-битного со знаком на 10000 результат превышает эти границы.

Ардуина хороша для базового обучения робототехнике, но не программированию на уровне чуть выше начального.

PS Называть "классикой жанра" такие индивидуальные особенности Ардуины у меня бы язык не повернулся.

PPS А вот переполнение ардуиновского 16-битного int при умножении может приводить к переполнению результата умножения, и оно может сделать контур обратной связи неустойчивым. Но к преобразованию к unsigned оно отношения не имеет, как и к печатаемому тексту "ovf".

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 12:30 
Аватара пользователя


11/12/16
13849
уездный город Н
realeugene в сообщении #1293382 писал(а):
У вас скорее всего ещё и петля обратной связи становится неустойчивой.


Не понимаю, о какой петле ОС Вы говорите.
Значения в переменной encCount всегда небольшие по модулю, но могут быть разных знаков. Это "щелчки" энкодера, 24 щелчка на оборот.
Функция, заполняющая эту переменную отлажена и работает нормально. Так что, чтобы переполнить double (больше чем $4294967040.0$, или меньше чем $-4294967040.0$) надо очень много и быстро крутить :-)

UPD: после применения в указанном выражении encCount обнуляется, и ждем очередных "щелчков".

realeugene в сообщении #1293382 писал(а):
Называть "классикой жанра" такие индивидуальные особенности Ардуины у меня бы язык не повернулся.

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

-- 20.02.2018, 12:34 --

realeugene в сообщении #1293382 писал(а):
А вот переполнение ардуиновского 16-битного int при умножении может приводить к переполнению результата умножения,


То есть результат умножения uint32_t (беззнаковое 32-битное) и int (знаковое 16-битное) будет int (16 битное знаковое)?

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 12:38 


27/08/16
10195
EUgeneUS в сообщении #1293386 писал(а):
Так что, чтобы переполнить double (больше чем $4294967040.0$, или меньше чем $-4294967040.0$) надо очень много и быстро крутить :-)
Скорее всего, вы чего-то не заметили. Результат 16-битного умножения со знаком ограничен по модулю 32768 даже при условии переполнений. В Ардуине используется avr-gcc, компилятор вполне стандартный.

EUgeneUS в сообщении #1293386 писал(а):
Классика жанра в том, что неявные преобразования типов могут приводить к чудесам.
Во втором вашем примере к чудесам приводят вовсе не неявные преобразования типа, а обычное переполнение 16-битной арифметики.

-- 20.02.2018, 12:38 --

EUgeneUS в сообщении #1293386 писал(а):
То есть результат умножения uint32_t (беззнаковое 32-битное) и int (знаковое 16-битное) будет int (16 битное знаковое)?

Нет. Но константа 10000 имеет тип "16-битное целое со знаком".

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 12:51 
Аватара пользователя


11/12/16
13849
уездный город Н
realeugene

У меня была и есть такая гипотеза: результатом умножения оказалось 32-битное беззнаковое, но с установленным старшим битом, которое и прибавилось.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 13:15 


27/08/16
10195
EUgeneUS в сообщении #1293392 писал(а):
У меня была и есть такая гипотеза: результатом умножения оказалось 32-битное беззнаковое, но с установленным старшим битом, которое и прибавилось.

По стандарту языка это умножение двух 16-битных целых со знаком с 16-битным же результатом со знаком. Но переполнение при умножении целых со знаком - это undefined behavior. Компилятор имеет право сломать вашу программу произвольным образом и в произвольном месте. Особенно это вероятно при оптимизации выражения с умножением на константу.

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение21.02.2018, 16:05 
Заслуженный участник
Аватара пользователя


01/09/13
4656
gevaraweb в сообщении #1291120 писал(а):
Как-то в тупик меня ввел код на жс, который вытворял невесть что

А что же он нехорошего вытворял?

gevaraweb в сообщении #1291120 писал(а):
Для ЧМ такое поведение языка очень некстати.

Если правильно угадываю "проблему", то так ведут себя почти все языки. И чем раньше об этом узнать, тем лучше....

 Профиль  
                  
 
 Re: О языках программирования для обучения
Сообщение20.03.2018, 23:31 


15/11/15
1080
Когда посмотрел «Рейд» :D :

Изображение

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 142 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10

Модераторы: Модераторы, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group