реклама на сайте
подробности

 
 
> целочисленный умножения, ошибка
Zelepuk
сообщение Sep 17 2011, 09:56
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



на такой код

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?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Sep 17 2011, 11:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Следует использовать для промежуточных вычислений 32-х битную переменную или явно приводить типы операндов.
Код
x = (uint16_t) (((uint32_t)y*32UL)/100UL);

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

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

Сообщение отредактировал rezident - Sep 17 2011, 11:16
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Sep 17 2011, 12:04
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(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). Точность устраивает.

Про посты по каждому "чиху": это вам это может паказаться чихом. А для меня это затруднения, которые могут показаться мелкими, но именно из них и складывается опыт. И ещё мне просто не у кого спросить... (( простите

Сообщение отредактировал Zelepuk - Sep 17 2011, 12:16
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.02724 секунд с 7
ELECTRONIX ©2004-2016