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

 
 
> Тип данных в Кейле
Desntal
сообщение Jun 10 2011, 05:18
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



подскажите начинающему, к какому типу данных правильно отнести число 900 . Дело в том что кейл одинаково отрабатывает и "uint" и "uchar" с подобным числом и в железе все работает правильно, хотя , если я не ошибаюсь, это двухбайтовая величина и должна быть типа "short"
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Desntal
сообщение Jun 10 2011, 06:46
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608



дополнение к вопросу.
фрагмент кода:

tval=tval*(0.625);//
return(tval);

после этой операции tval может принимать значение от 000 до 1200, далее идет сравнение с переменной содержащей число из этого диапазона.

извиняюсь, ошибка. Правильно от 0000 до 1200.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 10 2011, 07:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Desntal @ Jun 10 2011, 10:46) *
после этой операции tval может принимать значение от 000 до 1200
Вы хотите правильно объявить переменную tval? А, какой диапазон значений этой переменной до этой операции? От 0 до 1920? Тогда - unsigned int...

Применять операции с плавающей точкой в МК - очень расточительно. Достаточно привести 0.625 к виду 5/8 (деление на 8 целого = сдвиг вправо на 3), тогда
Код
tval= (5 * tval) >> 3;
Go to the top of the page
 
+Quote Post
koyodza
сообщение Jun 29 2011, 19:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(Палыч @ Jun 10 2011, 10:11) *
Вы хотите правильно объявить переменную tval? А, какой диапазон значений этой переменной до этой операции? От 0 до 1920? Тогда - unsigned int...

В корне неверно.
Если unsigned int умножать на 0,625, то в результате всегда будет 0
Потому как (int)0,625 будет 0
Если нужно получать не 0, то нужно использовать float (или double, если нужно, и если оно поддерживается)

Цитата(Палыч @ Jun 10 2011, 10:11) *
Применять операции с плавающей точкой в МК - очень расточительно. Достаточно привести 0.625 к виду 5/8 (деление на 8 целого = сдвиг вправо на 3), тогда
Код
tval= (5 * tval) >> 3;

Это правильно, без особой необходимости лучше плавучку на МК не использовать, здесь вам не тут, это не х86 с сопроцессором, однако.
Тем более когда речь идёт об умножении на константу
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 30 2011, 08:59
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(koyodza @ Jun 29 2011, 23:49) *
В корне неверно.
Если unsigned int умножать на 0,625, то в результате всегда будет 0
Потому как (int)0,625 будет 0
Вот те - раз...
В выражении
tval=tval*0.625 , где tval целого типа,
константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval...
Go to the top of the page
 
+Quote Post
koyodza
сообщение Jul 11 2011, 20:51
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(Палыч @ Jun 30 2011, 11:59) *
Вот те - раз...
В выражении
tval=tval*0.625 , где tval целого типа,
константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval...

Да, Вы правы, в данном случае происходит неявное приведение к double и обратно. Только вот оно надо?

В любом случае подобных конструкций лучше избегать
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2011, 05:42
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(koyodza @ Jul 12 2011, 00:51) *
В любом случае подобных конструкций лучше избегать

Совершенно верно. Тем более, что значение 0,625 можно представить в виде "красивой" дроби 5/8, с соответственным упрощением умножения на неё, о чём выше и сказано.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 12 2011, 07:02
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



К слову. Все современные компиляторы самостоятельно будут использовать сдвиг вместо деления когда это оправдано, так что (x*5)/8 совершенно равнозначно (х*5)>>3, но читается проще.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2011, 08:48
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(demiurg_spb @ Jul 12 2011, 11:02) *
Все современные компиляторы самостоятельно будут использовать сдвиг вместо деления когда это оправдано
Возможно, но иногда удивляешся коду, который нагенерил "современный" компилятор...

Цитата(demiurg_spb @ Jul 12 2011, 11:02) *
(x*5)/8 совершенно равнозначно (х*5)>>3
А, вот тут я с Вами не согласен. Насколько я помню (поправьте, если я не прав): раставленные в выражении (x*5)/8 скобочки никак не определяют последовательность выполнения операций. Поскольку приоритеты операций * и / одинаковые, то выражение (x*5)/8 с точки зрения компилятора в соответствии со стандартом эквивалентно x*5/8 или даже x*(5/8). Компилятор вправе на этапе трансляции вычислить часть выражения, если операнды - константы. Но, поскольку 5/8 равно нулю, то можно получить результат далёкий от ожидаемого...
При вычислении выражения (х*5)>>3 последовательность вычислений однозначно определена приоритетами.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 12 2011, 09:22
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Палыч @ Jul 12 2011, 12:48) *
Насколько я помню (поправьте, если я не прав): раставленные в выражении (x*5)/8 скобочки никак не определяют последовательность выполнения операций.

Поправляю. Вы не правы. И даже просто с позиции здравого смысла: нафиг скобки вообще нужны, если они ни на что не влияют?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2011, 09:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(scifi @ Jul 12 2011, 13:22) *
нафиг скобки вообще нужны, если они ни на что не влияют?
Я не утверждал, что скобки "ни на что не влияют". Например в выражении (х*5)>>3 они (скобки) очень даже "влияют". А, вот, в выражении (x*5)/8 компилятор вправе их игнорировать...
Пример попроще: выражение (х+2)-1. Как Вы думаете: компилятор сгенерирует 1) выполнение двух операций или 2) преобразует в х+(2-1) и, соответственно, вычислит на этапе трансляции (2-1) и, в конце концов, получим х+1 ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 12 2011, 09:50
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Я думаю что Вы оба правы. Когда можно упростить выражение без изменения сути, это будет сделано компилятором несомненно.
Но в примере с умножением и сдвигом никаких упрощений быть не может для целочисленных не кратных чисел.
Мне вот на ум приходит вредный совет для начинающих: не уверен в приоритетах операций - расставь скобочки.
И это правило работало всегда без исключений.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 12 2011, 09:56
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(demiurg_spb @ Jul 12 2011, 14:50) *
Я думаю что Вы оба правы. Когда можно упростить выражение без изменения сути, это будет сделано компилятором несомненно.

Докажите что ли на конкретном примере кода и компилятора. А так - очередной "вредный совет" или версия.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 12 2011, 10:03
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(GetSmart @ Jul 12 2011, 13:56) *
Докажите что ли на конкретном примере кода и компилятора. А так - очередной "вредный совет" или версия.
Для себя уже давно доказал на разных компиляторах...
Вы хотите увидеть как x=(x-1)+2 превратится в x+=1 ???


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 12 2011, 10:18
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(demiurg_spb @ Jul 12 2011, 15:03) *
Для себя уже давно доказал. Для разных компиляторов...

То есть какой-то компилятор может "наплевать" на скобки? Какой?

Upd.
Проверил на IAR-е.
Сложения и вычитания костант, идущие друг за другом даже за скобками он упрощает. Потому как переполнения на них не влияют. А умножения и деления нет.

Сообщение отредактировал GetSmart - Jul 12 2011, 10:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Desntal   Тип данных в Кейле   Jun 10 2011, 05:18
- - scifi   Вы что-то другое хотели спросить, потому что этот ...   Jun 10 2011, 05:48
- - Desntal   поясню вопрос: с термометра ds18b20 считываются дв...   Jun 10 2011, 06:10
|- - Палыч   Цитата(Desntal @ Jun 10 2011, 10:10) како...   Jun 10 2011, 06:28
||- - scifi   Цитата(Палыч @ Jul 12 2011, 13:43) А, вот...   Jul 12 2011, 09:55
|- - demiurg_spb   Проверил живьём на максимальном уровне оптимизации...   Jul 12 2011, 09:33
- - scifi   По-моему, этот топик просится, чтобы его перенесли...   Jun 10 2011, 07:49
- - Desntal   да, объяснить на пальцах трудно. может так понятне...   Jun 10 2011, 10:55
|- - Палыч   Цитата(Desntal @ Jun 10 2011, 14:55) для ...   Jun 10 2011, 11:13
- - Desntal   Палыч, спасибо, просмотрел файл, теперь все ясно м...   Jun 10 2011, 11:20
|- - Палыч   А, к моему совету (см. пост #6) по поводу исключен...   Jun 10 2011, 11:32
- - scifi   Цитата(GetSmart @ Jul 12 2011, 14:18) То ...   Jul 12 2011, 10:27
- - Палыч   Цитата(scifi @ Jul 12 2011, 13:55) Ну, ес...   Jul 12 2011, 10:49
- - GetSmart   Цитата(Палыч @ Jul 12 2011, 15:49) Нет вр...   Jul 12 2011, 10:59
|- - Палыч   Цитата(GetSmart @ Jul 12 2011, 14:59) иск...   Jul 12 2011, 13:04
- - scifi   Цитата(Палыч @ Jul 12 2011, 14:49) Нет, з...   Jul 12 2011, 11:19


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

 


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


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