Математическая задача
- DrMario
- Лейтенант
- Сообщения: 378
- Зарегистрирован: 07 ноя 2016, 13:11
- Откуда: Камень-на-Оби
- Имя: Евгений
- Контактная информация:
Математическая задача
Помогите решить задачу по математике с двумя переменными.
Переменные C D - это два байта, могут принимать значение 0-255. Правильный ответ должен быть от -128 до +128, но он получается неправильный, голову уже сломал.
Переменные C D - это два байта, могут принимать значение 0-255. Правильный ответ должен быть от -128 до +128, но он получается неправильный, голову уже сломал.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Математическая задача
У вас же там подсказка 0.5!! , может до тяпницы подождать?



Первая строка с типом данных float, вторая строка integer
[spoiler] [/spoiler]
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось com 09 фев 2022, 05:37, всего редактировалось 1 раз.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Математическая задача
[spoiler] [/spoiler]
Если Вам нужно получить на выходе 0,5 используйте float, integer - это целочисленный тип данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Математическая задача
В Вашем случае, примера, уберём общий знаменатель и получим:
С + D/256 - 128 =
Что имеем на выходе при байтах и округлении до байта по 0.5
С-128 и +1 при D > 127
Как-то так.
Отправлено спустя 5 минут 32 секунды:
Что-бы получить указанный Вами диапазон, нужно привести результат к типу char, он же int8_t, а затем, желательно, к integer.
Однако, для каждого конкретного компилятора нужно смотреть результат.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Dryundel
- Полковник
- Сообщения: 2451
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 6 раз
- Поблагодарили: 31 раз
Математическая задача
Ха-ха. И ни одного грамотного ответа. Даже [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].
Он упростил формулу. Это хорошо. Но почему...
А вот это для чего? Я вообще не понял.

Самый правильный из ответов это предложение от [ref]com[/ref]. Вычисления будут верными, но зачем же заставлять контроллер с самого начала работать с float. Это тяжелые вычисления.
Вроде бы мудрее поступил [ref]Naladchik[/ref], добавив float только при делении, т.к. до этого дробных быть не может. Однако он позабыл про самое первое действие умножения. Там два integer, значит и на выходе первого блока будет integer а это -32768… 32767. Умножив 256 * 255 = 65280. В результате будет ошибка. Нужен long int на любом из входов.
Теперь [ref=#ff8000]Sancho[/ref].

Он упростил формулу. Это хорошо. Но почему...
С + D/256 - 128 = 255 + 255/256 - 128 = 127 (при округлении) почему до +1? Точно не выспался.Sancho писал(а): 09 фев 2022, 08:38 Что имеем на выходе при байтах и округлении до байта по 0.5
С-128 и +1 при D > 127

А вот это для чего? Я вообще не понял.
Да и в вопросе топикстартера ошибка:Sancho писал(а): 09 фев 2022, 08:38 Что-бы получить указанный Вами диапазон, нужно привести результат к типу char, он же int8_t, а затем, желательно, к integer.
Исходя из формулы результат не может быть "+128" , максимум 127
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Математическая задача
Если операции с байтами, то результат округляем: при D менее или равно 127 то d/256 даст 0, при более 127 результат деления на 256 примем 1Dryundel писал(а): 09 фев 2022, 10:11 С + D/256 - 128 = 255 + 255/256 - 128 = 127 (при округлении) почему до +1? Точно не выспался.
Только с аргументом 128 в уравнении не понятно, т.к. 128 более половины байта, будут сложности с типами.
Итого:
255 + 255/256 - 128 = 255 + 1 - 128 = 128 - это переполнение int8_t
0 + 0 - 128 = -128 это в пределах типа.
да вроде как
Тут правда засада, указанный диапазон, от -128 до +128, выходит за рамки 8 бит.DrMario писал(а): 09 фев 2022, 02:53 Переменные C D - это два байта, могут принимать значение 0-255. Правильный ответ должен быть от -128 до +128, но он получается неправильный, голову уже сломал.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Dryundel
- Полковник
- Сообщения: 2451
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 6 раз
- Поблагодарили: 31 раз
Математическая задача
А никто не говорил что результат должен быть байтовым или целочисленным.
Ну тогда так и говори.
А то любишь людей запутывать.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 раз
- Контактная информация:
Математическая задача
Сорян, не до конца изложил мысль,
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Математическая задача
Ничего се зубры поляну натоптали
. ТС какую задачу поставил? Что бы было 0,5.! А уж как там да чего там моя незнай
я честно говоря и так доволен тем, что чуть чуть приблизился к волшебству программирования благодаря Автору, иначе все это так и осталось бы мечтой. Хорошо в детстве ознакомился и освоил логику, счетчики компаратор. Досих пор поражаюсь, только по книжкам и без какой либо практики в железе. Так что чем мог тем помог


Математическая задача
Еще вариант с блоком "scale". Жаль он с Float не работает.
[spoiler= Скрины- ups.flp] [/spoiler]
[spoiler= Скрины- ups.flp] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Dryundel
- Полковник
- Сообщения: 2451
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 6 раз
- Поблагодарили: 31 раз
Математическая задача
Ну так можно же умножить вход и выход на 100 например, а потом вернуть его во float делением.
Отправлено спустя 18 минут 11 секунд:
Я к стати думал про масштабирование, но так бросил эту мысль. С утра лень было.
А задачка очень просто решается двумя блоками масштабирования и одним сложением. (если дробные не нужны)
Если же требуются то в начале умножаем на коэффициент 10 или 100 или 1000 а потом делим результат на него же.
Отправлено спустя 22 минуты 52 секунды:
Во! Готово.
Оба варианта.
Проверяйте, должно работать.
[spoiler=Скрин решения] [/spoiler] Отправлено спустя 20 минут 52 секунды:
Похоже топикстартер сдулся. Погиб при решении задачи. В 3 часа ночи по Москве. Написал просьбу о помощи и все! Это было его последнее посещение.
Наверное ударился головой об подушку и потерял сознание.

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

У вас нет необходимых прав для просмотра вложений в этом сообщении.
Математическая задача
Попробуйте вывести такие данные в integer из разных источников на вход UART : 123, 456, 789, "№;%?*
Математическая задача
Это не integer.
А так опять не понял зачем вызывать функцию конвертации в string.


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

Математическая задача
Пожалуйста. viewtopic.php?f=231&t=7890
Просто доработал под STM32 и вывожу float (координаты GPS).
Просто доработал под STM32 и вывожу float (координаты GPS).
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей