2014 dxdy logo

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

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




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

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

 
 
 
 Re: О языках программирования для обучения
Сообщение20.02.2018, 13:15 
EUgeneUS в сообщении #1293392 писал(а):
У меня была и есть такая гипотеза: результатом умножения оказалось 32-битное беззнаковое, но с установленным старшим битом, которое и прибавилось.

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

 
 
 
 Re: О языках программирования для обучения
Сообщение21.02.2018, 16:05 
Аватара пользователя
gevaraweb в сообщении #1291120 писал(а):
Как-то в тупик меня ввел код на жс, который вытворял невесть что

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

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

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

 
 
 
 Re: О языках программирования для обучения
Сообщение20.03.2018, 23:31 
Когда посмотрел «Рейд» :D :

Изображение

 
 
 [ Сообщений: 142 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group