|
Тип данных в Кейле |
|
|
|
Jun 10 2011, 05:18
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
подскажите начинающему, к какому типу данных правильно отнести число 900 . Дело в том что кейл одинаково отрабатывает и "uint" и "uchar" с подобным числом и в железе все работает правильно, хотя , если я не ошибаюсь, это двухбайтовая величина и должна быть типа "short"
|
|
|
|
|
 |
Ответов
|
Jun 10 2011, 06:46
|
Группа: Новичок
Сообщений: 5
Регистрация: 10-06-11
Пользователь №: 65 608

|
дополнение к вопросу. фрагмент кода:
tval=tval*(0.625);// return(tval);
после этой операции tval может принимать значение от 000 до 1200, далее идет сравнение с переменной содержащей число из этого диапазона.
извиняюсь, ошибка. Правильно от 0000 до 1200.
|
|
|
|
|
Jun 10 2011, 07:11
|

Гуру
     
Группа: Свой
Сообщений: 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;
|
|
|
|
|
Jun 29 2011, 19:49
|

Местный
  
Группа: Свой
Сообщений: 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 с сопроцессором, однако. Тем более когда речь идёт об умножении на константу
|
|
|
|
|
Jun 30 2011, 08:59
|

Гуру
     
Группа: Свой
Сообщений: 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...
|
|
|
|
|
Jul 11 2011, 20:51
|

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

|
Цитата(Палыч @ Jun 30 2011, 11:59)  Вот те - раз... В выражении tval=tval*0.625 , где tval целого типа, константа 0.625 - вещественная; значение tval приводится к вещественному типу; производится умножение двух вещественных; результат приводится к целому; присваивается tval... Да, Вы правы, в данном случае происходит неявное приведение к double и обратно. Только вот оно надо? В любом случае подобных конструкций лучше избегать
|
|
|
|
|
Jul 12 2011, 08:48
|

Гуру
     
Группа: Свой
Сообщений: 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 последовательность вычислений однозначно определена приоритетами.
|
|
|
|
|
Jul 12 2011, 09:43
|

Гуру
     
Группа: Свой
Сообщений: 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 ?
|
|
|
|
|
Jul 12 2011, 09:55
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Палыч @ Jul 12 2011, 13:43)  А, вот, в выражении (x*5)/8 компилятор вправе их игнорировать... Ну, если мне не верите, проверьте сами. По-вашему выражение (x*5)/8 даёт результат 0 вне зависимости от значения x. Это легко проверить. Или Вы хотите сказать, что результат выражения зависит от уровня оптимизации? Тогда это вообще нонсенс. Кому нужна оптимизация, коверкающая результат простейшего арифметического выражения? Не говоря уже о том, что это просто противоречит стандарту языка Си. Добавление: Да, в стандарте языка указаны случаи, в которых порядок вычисления не определён. Например, порядок вычисления аргументов функции. Или операндов побитового И или ИЛИ (& или |). Но (x*5)/8 - не тот случай. Стандарт чётко описывает, что сначала идёт умножение, а потом - деление (кстати, и без скобок тоже, по правилам приоритетов операторов). Причём умножение и деление происходят в "абстрактной машине". Что там нагенерит компилятор - его дело, лишь бы результат был бы такой же, как в "абстрактной машине". Как мы видели, он может нагенерить сдвиги и сложения. Или вообще подставить константу, если результат выражения известен на этапе компиляции.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|