|
Тип данных в Кейле |
|
|
|
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 последовательность вычислений однозначно определена приоритетами.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|