4 / 5 / 2
Регистрация: 02.04.2018
Сообщений: 488
|
||||||
1 | ||||||
Баг в среде ардуино02.06.2022, 12:39. Показов 492. Ответов 2
Метки нет (Все метки)
Нашёл баг в среде Ардуино. Может быть конечно у меня корявые руки, но в принципе как говориться, тут ломаться-то нечему.
Есть функция pow(x, 3); = и вот она творит чудеса. если вызвать её и посчитать к примеру pow(-48, 3)/48; результат вычислений будет -2304 всё верно, но стоит заключить в цикл и перебирать переменную x, как начинается магия. почему-то результат вычислений функции -2303, хотя с квадратом данная функция считает всё правильно. Решил разобраться с этим вопросом и выяснил что при значениях -48 функция pow(x,3) выдаёт ответ -110591 (а должно быть -110592) поэтому при делении получается число -2 303,9791666666666666666666666667 что даёт округление к ближайшему меньшему -2303. Если заменить функцию простым умножением x*x*x/48 = то результат вычислений сразу становится правильным. Интересный баг, по отдельности функция вычисляет число верно, но стоит её загнать в цикл, как происходит магия кривого вычисления. Немного дописав программу увидел подобный баг в числах -60, -48, -36, и других числах кратные 12... что за... магия...
0
|
02.06.2022, 12:39 | |
Ответы с готовыми решениями:
2
Баг Ардуино при вычислениях В среде ардуино нет возможности выбрать порт Как проверить реле к ардуино без ардуино ESP32 в среде ардуино WEB server + MQTT |
4 / 5 / 2
Регистрация: 02.04.2018
Сообщений: 488
|
|
02.06.2022, 12:58 [ТС] | 2 |
Кстати, добавлю, на чистом языке C++ он считает верно, значит виноват сам компилятор дурины и его корявая функция pow?
0
|
634 / 389 / 75
Регистрация: 21.09.2008
Сообщений: 1,328
|
||||||
05.06.2022, 15:53 | 3 | |||||
Хм. Посмотрим.
Настоящий критерий истины - практика, верно? Вот и напишем проверку на чистом Си с использованием стандартной библиотеки avr-libc-2.0.0 и компилятора GCC-11.1 для AVR, запустим под настоящим "железом" в виде ATmega8A. У Вас какая версия компилятора была использована?
Кликните здесь для просмотра всего текста
-60:->-4500,-4500
-59:->-4278,-4278 -58:->-4064,-4064 -57:->-3858,-3858 -56:->-3658,-3658 -55:->-3466,-3466 -54:->-3280,-3280 -53:->-3101,-3101 -52:->-2929,-2929 -51:->-2763,-2763 -50:->-2604,-2604 -49:->-2451,-2451 -48:->-2304,-2303 -47:->-2162,-2162 -46:->-2027,-2027 -45:->-1898,-1898 -44:->-1774,-1774 -43:->-1656,-1656 -42:->-1543,-1543 -41:->-1435,-1435 -40:->-1333,-1333 -39:->-1235,-1235 -38:->-1143,-1143 -37:->-1055,-1055 -36:->-972,-971 -35:->-893,-893 -34:->-818,-818 -33:->-748,-748 -32:->-682,-682 -31:->-620,-620 -30:->-562,-562 -29:->-508,-508 -28:->-457,-457 -27:->-410,-410 -26:->-366,-366 -25:->-325,-325 -24:->-288,-287 -23:->-253,-253 -22:->-221,-221 -21:->-192,-192 -20:->-166,-166 -19:->-142,-142 -18:->-121,-121 -17:->-102,-102 -16:->-85,-85 -15:->-70,-70 -14:->-57,-57 -13:->-45,-45 -12:->-36,-35 -11:->-27,-27 -10:->-20,-20 -9:->-15,-15 -8:->-10,-10 -7:->-7,-7 -6:->-4,-4 -5:->-2,-2 -4:->-1,-1 -3:->0,0 -2:->0,0 -1:->0,0 0:->0,0 1:->0,0 2:->0,0 3:->0,0 4:->1,1 5:->2,2 6:->4,4 7:->7,7 8:->10,10 9:->15,15 10:->20,20 11:->27,27 12:->36,35 13:->45,45 14:->57,57 15:->70,70 16:->85,85 17:->102,102 18:->121,121 19:->142,142 20:->166,166 21:->192,192 22:->221,221 23:->253,253 24:->288,287 25:->325,325 26:->366,366 27:->410,410 28:->457,457 29:->508,508 30:->562,562 31:->620,620 32:->682,682 33:->748,748 34:->818,818 35:->893,893 36:->972,971 37:->1055,1055 38:->1143,1143 39:->1235,1235 40:->1333,1333 41:->1435,1435 42:->1543,1543 43:->1656,1656 44:->1774,1774 45:->1898,1898 46:->2027,2027 47:->2162,2162 48:->2304,2303 49:->2451,2451 50:->2604,2604 51:->2763,2763 52:->2929,2929 53:->3101,3101 54:->3280,3280 55:->3466,3466 56:->3658,3658 57:->3858,3858 58:->4064,4064 59:->4278,4278 pow(-24.0, 3.0)/48.0 = -288 pow(-12.0, 3.0)/48.0 = -36 pow(12.0, 3.0)/48.0 = 36 pow(36.0, 3.0)/48.0 = 972 pow(48.0, 3.0)/48.0 = 2304 x у Вас приращивается на целочисленную единицу (+1), а не +1.0f (если понимаете эту тонкость).Строго говоря, выявленная особенность находится не в среде Arduino, а в компиляторе AVR-GCC, который используется для сборки ПО. Вспомогательная библиотечка UART для вывода в консоль, файлы прошивок примера под ATmega8A и ATmega328p приложены в архиве.
0
|
05.06.2022, 15:53 | |
05.06.2022, 15:53 | |
Помогаю со студенческими работами здесь
3
Связь по Блютузу Андроид и Ардуино, команды с Ардуино Баг в программе. Без цикла работает нормально. С циклом выдает баг std::regex : баг на сайте или баг компилятора? Баг asio? или баг TCP стека? Забавный баг Делфи ...или не баг? Letter-spacing баг или не баг? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |