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

 
 
> Тип данных в Кейле
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

Сообщений в этой теме
- 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:22) нафиг ...   Jul 12 2011, 09:43
||- - 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
||- - 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 - 15:11
Рейтинг@Mail.ru


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