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

 
 
> Тип данных в Кейле
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
scifi
сообщение Jul 12 2011, 09:55
Сообщение #12


Гуру
******

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



Цитата(Палыч @ Jul 12 2011, 13:43) *
А, вот, в выражении (x*5)/8 компилятор вправе их игнорировать...

Ну, если мне не верите, проверьте сами. По-вашему выражение (x*5)/8 даёт результат 0 вне зависимости от значения x. Это легко проверить. Или Вы хотите сказать, что результат выражения зависит от уровня оптимизации? Тогда это вообще нонсенс. Кому нужна оптимизация, коверкающая результат простейшего арифметического выражения? Не говоря уже о том, что это просто противоречит стандарту языка Си.

Добавление:
Да, в стандарте языка указаны случаи, в которых порядок вычисления не определён. Например, порядок вычисления аргументов функции. Или операндов побитового И или ИЛИ (& или |). Но (x*5)/8 - не тот случай. Стандарт чётко описывает, что сначала идёт умножение, а потом - деление (кстати, и без скобок тоже, по правилам приоритетов операторов). Причём умножение и деление происходят в "абстрактной машине". Что там нагенерит компилятор - его дело, лишь бы результат был бы такой же, как в "абстрактной машине". Как мы видели, он может нагенерить сдвиги и сложения. Или вообще подставить константу, если результат выражения известен на этапе компиляции.
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
||- - demiurg_spb   Я думаю что Вы оба правы. Когда можно упростить вы...   Jul 12 2011, 09:50
|||- - GetSmart   Цитата(demiurg_spb @ Jul 12 2011, 14:50) ...   Jul 12 2011, 09:56
|||- - demiurg_spb   Цитата(GetSmart @ Jul 12 2011, 13:56) Док...   Jul 12 2011, 10:03
|||- - GetSmart   Цитата(demiurg_spb @ Jul 12 2011, 15:03) ...   Jul 12 2011, 10:18
|- - 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 Текстовая версия Сейчас: 29th July 2025 - 12:11
Рейтинг@Mail.ru


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