Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: целочисленный умножения
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Zelepuk
на такой код

unsigned int x;

x = 5313*100;

IAR предупреждает
Warning[Pe061]: integer operation result is out of range
Warning[Pe068]: integer conversion resulted in a change of sign

и соотвественно в "x" лежит уже не то что хотел.
Странно, почему нелзя получить 531300, ведь оно укладывается в диапазон uint?
scifi
Цитата(Zelepuk @ Sep 17 2011, 13:56) *
Странно, почему нелзя получить 531300, ведь оно укладывается в диапазон uint?

Разве укладывается? Наверное, в MSP430 unsigned int имеет размер 16 бит. 5313 и 100 - константы типа int, и максимальное значение int - это 32767.
Zelepuk
как же тогда быть, если мне нужно из переменной (y), которая может принимать значения от 5100 до 5200 получить значение x по формуле
x = y*32/100 ???
rezident
Следует использовать для промежуточных вычислений 32-х битную переменную или явно приводить типы операндов.
Код
x = (uint16_t) (((uint32_t)y*32UL)/100UL);

Можно конечно воспользоваться и неявным приведением типов.
Код
x = (((uint32_t)y*32UL)/100;

Кстати, эта тема имеет слабое отношение к разделу MSP430. Это раз. Во-вторых, не могли бы вы перестать плодить новые темы по каждому "чиху"? Вы же разрабатываете электросчетчик на MSP430 вроде? Вот и пишите в одной теме о всех проблемах с которыми сталкиваетесь при этом. И вам самому и читающим ваши сообщения будет удобнее и понятнее контекст ваших вопросов/проблем.
P.S. пардон, просмотрел, что у вас беззнаковые операнды. Поправил. Кстати, а значительная ошибка округления при целочисленных вычислениях вас нисколько не смущает?
Zelepuk
Цитата(rezident @ Sep 17 2011, 15:10) *
Следует использовать для промежуточных вычислений 32-х битную переменную или явно приводить типы операндов.
Код
x = (uint16_t) (((uint32_t)y*32UL)/100UL);

Можно конечно воспользоваться и неявным приведением типов.
Код
x = (((uint32_t)y*32UL)/100;

Кстати, эта тема имеет слабое отношение к разделу MSP430. Это раз. Во-вторых, не могли бы вы перестать плодить новые темы по каждому "чиху"? Вы же разрабатываете электросчетчик на MSP430 вроде? Вот и пишите в одной теме о всех проблемах с которыми сталкиваетесь при этом. И вам самому и читающим ваши сообщения будет удобнее и понятнее контекст ваших вопросов/проблем.
P.S. пардон, просмотрел, что у вас беззнаковые операнды. Поправил. Кстати, а значительная ошибка округления при целочисленных вычислениях вас нисколько не смущает?


Спасибо. не то чтобы разрабатываю. Просто "ковыряю" апликуху от TI.

Ошибка округления? Я проверил свой код в CBuilder (использовал только short и int). Точность устраивает.

Про посты по каждому "чиху": это вам это может паказаться чихом. А для меня это затруднения, которые могут показаться мелкими, но именно из них и складывается опыт. И ещё мне просто не у кого спросить... (( простите
rezident
Цитата(Zelepuk @ Sep 17 2011, 17:04) *
Ошибка округления? Я проверил свой код в CBuilder (использовал только short и int). Точность устраивает.

Это потому, что у вас величина входного параметра довольно большая по сравнению с делителем, в то время как диапазон ее изменения наоборот небольшой. Посчитайте в расчете, что входное значение числа меньше сотни. Ошибка сразу до единиц процентов возрастет.
Zelepuk
Цитата(rezident @ Sep 17 2011, 16:14) *
Это потому, что у вас величина входного параметра довольно большая по сравнению с делителем, в то время как диапазон ее изменения наоборот небольшой. Посчитайте в расчете, что входное значение числа меньше сотни. Ошибка сразу до единиц процентов возрастет.


у меня есть априорные пределы в которых изменяются переменные(расчёты касаются электрических параметров: пределы изменения частоты, напряжения и т.д.). В билдере прогонял и так и эдак - устраивает.
scifi
Цитата(Zelepuk @ Sep 17 2011, 14:56) *
как же тогда быть, если мне нужно из переменной (y), которая может принимать значения от 5100 до 5200 получить значение x по формуле
x = y*32/100 ???

Можно так: x = y * 8U / 25U;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.