Математическая задача

Аватара пользователя
DrMario
Лейтенант
Сообщения: 378
Зарегистрирован: 07 ноя 2016, 13:11
Откуда: Камень-на-Оби
Имя: Евгений
Контактная информация:

Математическая задача

Сообщение DrMario »

Помогите решить задачу по математике с двумя переменными.
Переменные C D - это два байта, могут принимать значение 0-255. Правильный ответ должен быть от -128 до +128, но он получается неправильный, голову уже сломал.
ups.PNG
ups.flp
Снимок.PNG
У вас нет необходимых прав для просмотра вложений в этом сообщении.
com
Капитан
Сообщения: 832
Зарегистрирован: 31 май 2018, 22:12
Откуда: Санкт-Петербург
Имя: Ринат

Математическая задача

Сообщение com »

DrMario писал(а): 09 фев 2022, 02:53 Помогите решить задачу по математике с двумя переменными
У вас же там подсказка 0.5!! , может до тяпницы подождать? :D . В общем, поменяйте тип данных в математических блоках с integer на float :yes: :smile9:
Первая строка с типом данных float, вторая строка integer
[spoiler]
0.5.jpg
[/spoiler]
[spoiler]
IMG_20220209_072953.jpg
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось com 09 фев 2022, 05:37, всего редактировалось 1 раз.
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

Математическая задача

Сообщение Naladchik »

DrMario писал(а): 09 фев 2022, 02:53 ...получается неправильный...
[spoiler]
111.png
[/spoiler]
Если Вам нужно получить на выходе 0,5 используйте float, integer - это целочисленный тип данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64. FLProg Portable.
Изображение
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Математическая задача

Сообщение Sancho »

DrMario писал(а): 09 фев 2022, 02:53 Помогите решить задачу по математике с двумя переменными.
DrMario писал(а): 09 фев 2022, 02:53Пример
В Вашем случае, примера, уберём общий знаменатель и получим:
С + D/256 - 128 =
Что имеем на выходе при байтах и округлении до байта по 0.5
С-128 и +1 при D > 127
Как-то так.

Отправлено спустя 5 минут 32 секунды:
Что-бы получить указанный Вами диапазон, нужно привести результат к типу char, он же int8_t, а затем, желательно, к integer.
Однако, для каждого конкретного компилятора нужно смотреть результат.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2451
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 6 раз
Поблагодарили: 31 раз

Математическая задача

Сообщение Dryundel »

Ха-ха. И ни одного грамотного ответа. Даже [ref=#ff8000]Sancho[/ref], перемудрил. :) Не выспались похоже.
Самый правильный из ответов это предложение от [ref]com[/ref]. Вычисления будут верными, но зачем же заставлять контроллер с самого начала работать с float. Это тяжелые вычисления.
Вроде бы мудрее поступил [ref]Naladchik[/ref], добавив float только при делении, т.к. до этого дробных быть не может. Однако он позабыл про самое первое действие умножения. Там два integer, значит и на выходе первого блока будет integer а это -32768… 32767. Умножив 256 * 255 = 65280. В результате будет ошибка. Нужен long int на любом из входов.
Теперь [ref=#ff8000]Sancho[/ref]. :)
Он упростил формулу. Это хорошо. Но почему...
Sancho писал(а): 09 фев 2022, 08:38 Что имеем на выходе при байтах и округлении до байта по 0.5
С-128 и +1 при D > 127
С + D/256 - 128 = 255 + 255/256 - 128 = 127 (при округлении) почему до +1? Точно не выспался. :yes:

А вот это для чего? Я вообще не понял.
Sancho писал(а): 09 фев 2022, 08:38 Что-бы получить указанный Вами диапазон, нужно привести результат к типу char, он же int8_t, а затем, желательно, к integer.
Да и в вопросе топикстартера ошибка:
DrMario писал(а): 09 фев 2022, 02:53 Правильный ответ должен быть от -128 до +128 ...
Исходя из формулы результат не может быть "+128" , максимум 127
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Математическая задача

Сообщение Sancho »

Dryundel писал(а): 09 фев 2022, 10:11 Теперь Sancho.
Он упростил формулу. Это хорошо. Но почему...
Dryundel писал(а): 09 фев 2022, 10:11 С + D/256 - 128 = 255 + 255/256 - 128 = 127 (при округлении) почему до +1? Точно не выспался.
Если операции с байтами, то результат округляем: при D менее или равно 127 то d/256 даст 0, при более 127 результат деления на 256 примем 1
Только с аргументом 128 в уравнении не понятно, т.к. 128 более половины байта, будут сложности с типами.
Итого:
255 + 255/256 - 128 = 255 + 1 - 128 = 128 - это переполнение int8_t
0 + 0 - 128 = -128 это в пределах типа.
Dryundel писал(а): 09 фев 2022, 10:11 А вот это для чего? Я вообще не понял.

да вроде как
DrMario писал(а): 09 фев 2022, 02:53 Переменные C D - это два байта, могут принимать значение 0-255. Правильный ответ должен быть от -128 до +128, но он получается неправильный, голову уже сломал.
Тут правда засада, указанный диапазон, от -128 до +128, выходит за рамки 8 бит.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2451
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 6 раз
Поблагодарили: 31 раз

Математическая задача

Сообщение Dryundel »

Sancho писал(а): 09 фев 2022, 10:28 Если операции с байтами, то результат округляем:
А никто не говорил что результат должен быть байтовым или целочисленным.

Ну тогда так и говори.
Sancho писал(а): 09 фев 2022, 10:28 при D менее или равно 127 то d/256 даст 0, при более 127 результат деления на 256 примем 1
А то любишь людей запутывать. :)
Sancho писал(а): 09 фев 2022, 08:38 В Вашем случае, примера, уберём общий знаменатель и получим:
С + D/256 - 128 =
Что имеем на выходе при байтах и округлении до байта по 0.5
С-128 и +1 при D > 127
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

Математическая задача

Сообщение Sancho »

Dryundel писал(а): 09 фев 2022, 10:45 А то любишь людей запутывать.
Сорян, не до конца изложил мысль,
Dryundel писал(а): 09 фев 2022, 10:11 Даже Sancho, перемудрил. Не выспались похоже.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
com
Капитан
Сообщения: 832
Зарегистрирован: 31 май 2018, 22:12
Откуда: Санкт-Петербург
Имя: Ринат

Математическая задача

Сообщение com »

Ничего се зубры поляну натоптали :D. ТС какую задачу поставил? Что бы было 0,5.! А уж как там да чего там моя незнай :smile469: я честно говоря и так доволен тем, что чуть чуть приблизился к волшебству программирования благодаря Автору, иначе все это так и осталось бы мечтой. Хорошо в детстве ознакомился и освоил логику, счетчики компаратор. Досих пор поражаюсь, только по книжкам и без какой либо практики в железе. Так что чем мог тем помог
Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06 сен 2015, 09:39
Откуда: Баку

Математическая задача

Сообщение dekorator »

Еще вариант с блоком "scale". Жаль он с Float не работает.
[spoiler= Скрины- ups.flp]
ups.flp_Лист1.png
ups.png
[/spoiler]
ups.flp
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2451
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 6 раз
Поблагодарили: 31 раз

Математическая задача

Сообщение Dryundel »

dekorator писал(а): 09 фев 2022, 14:48 Еще вариант с блоком "scale". Жаль он с Float не работает.
Ну так можно же умножить вход и выход на 100 например, а потом вернуть его во float делением.

Отправлено спустя 18 минут 11 секунд:
Я к стати думал про масштабирование, но так бросил эту мысль. С утра лень было.
А задачка очень просто решается двумя блоками масштабирования и одним сложением. (если дробные не нужны)
Если же требуются то в начале умножаем на коэффициент 10 или 100 или 1000 а потом делим результат на него же.

Отправлено спустя 22 минуты 52 секунды:
Во! Готово.
Оба варианта.
Проверяйте, должно работать.
[spoiler=Скрин решения]
Задачка.jpg
[/spoiler]
Задачка.flp
Отправлено спустя 20 минут 52 секунды:
Похоже топикстартер сдулся. Погиб при решении задачи. В 3 часа ночи по Москве. Написал просьбу о помощи и все! Это было его последнее посещение.
Наверное ударился головой об подушку и потерял сознание. :D
У вас нет необходимых прав для просмотра вложений в этом сообщении.
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

Математическая задача

Сообщение AndrejK »

Можно спросить... Зачем конвертировать в стринг? Что это дает?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
AlexCrane
Капитан
Сообщения: 903
Зарегистрирован: 20 окт 2017, 13:22
Откуда: Ульяновск
Имя: Александр
Поблагодарили: 12 раз

Математическая задача

Сообщение AlexCrane »

AndrejK писал(а): 10 фев 2022, 20:23 Можно спросить... Зачем конвертировать в стринг? Что это дает?
Визуальную читаемость человеком
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

Математическая задача

Сообщение AndrejK »

Одинаково... :smile37:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
com
Капитан
Сообщения: 832
Зарегистрирован: 31 май 2018, 22:12
Откуда: Санкт-Петербург
Имя: Ринат

Математическая задача

Сообщение com »

AndrejK писал(а): 10 фев 2022, 20:23 Можно спросить... Зачем конвертировать в стринг? Что это дает?
Попробуйте вывести такие данные в integer из разных источников на вход UART : 123, 456, 789, "№;%?*
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

Математическая задача

Сообщение AndrejK »

com писал(а): 10 фев 2022, 21:09"№;%?*
Это не integer.
А так опять не понял зачем вызывать функцию конвертации в string. :smile37: :smile37:

Отправлено спустя 12 минут 9 секунд:
Плюс память...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2451
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 6 раз
Поблагодарили: 31 раз

Математическая задача

Сообщение Dryundel »

AndrejK писал(а): 10 фев 2022, 20:23 Можно спросить... Зачем конвертировать в стринг? Что это дает?
В данном случае ничего не дает. Человек видимо по аналогии с LCD вставил блок конвертации.
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

Математическая задача

Сообщение AndrejK »

Dryundel писал(а): 10 фев 2022, 21:44 Человек видимо по аналогии с LCD вставил блок конвертации.
Так и в LCD ничего не дает. Я просто спросил. :smile9:
Аватара пользователя
Dryundel
Полковник
Сообщения: 2451
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 6 раз
Поблагодарили: 31 раз

Математическая задача

Сообщение Dryundel »

AndrejK писал(а): 10 фев 2022, 21:50 Так и в LCD ничего не дает.
Да ладно! А ну-ка попробуйте к блоку LCD (HD44780) привязать integer. Удивите нас. :)
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

Математическая задача

Сообщение AndrejK »

Пожалуйста. viewtopic.php?f=231&t=7890
Просто доработал под STM32 и вывожу float (координаты GPS).
Ответить

Вернуться в «Помогите, а то я "нимагу"»

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

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