03.04.2018, 13:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,848
Сказал спасибо: 5,591
Сказали Спасибо 25,471 раз(а) в 5,729 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Чего-то я уперся в форматы данных..
Код:
|
float Ktemp;
int16 Vdiod;
Vdiod = 2485;
Ktemp =(float)(Vdiod / 295);
printf("Vdiod = %Lu\n",Vdiod);
printf("Ktemp = %f\n",Ktemp);
printf("Ktemp = %g\n",Ktemp);
printf("Ktemp = %e\n\r",Ktemp); |
В результате на выходе:
Цитата:
|
Vdiod = 2485
Ktemp = 8.00
Ktemp = 8.00
Ktemp = 8.000000E+00
|
должно получиться дробное число:
2485 / 295 = 8.423728813559322
Но на печать вылетает нифига не дробное. Понимаю, что компилятор смотрит на циферки, считает, что для экономии программной памяти проще i16/i16 поделить и так и делает. Потом результат записывает в переменную float. Экономно, да. Но дробная часть теряется.
Как его заставить в этом месте не экономить память?
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/
моя домашняя страничка: http://www.eddy.com.ua/
|
|
|
|
03.04.2018, 13:45
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 735
Сказал спасибо: 363
Сказали Спасибо 808 раз(а) в 380 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
или
Ktemp = Vdiod / 295.0;
или
Ktemp =((float)Vdiod) / 295.0;
|
|
|
Сказали "Спасибо" j-Roger
|
|
|
03.04.2018, 13:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,848
Сказал спасибо: 5,591
Сказали Спасибо 25,471 раз(а) в 5,729 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Прикольно, но только что сам до этого дошел. Точка с нулем сработала
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/
моя домашняя страничка: http://www.eddy.com.ua/
Последний раз редактировалось Eddy71; 03.04.2018 в 14:22.
|
|
|
|
03.04.2018, 16:08
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от j-Roger
|
или
Ktemp = Vdiod / 295.0;
или
Ktemp =((float)Vdiod) / 295.0;
|
Во втором варианте '.0' здесь лишние
Код:
|
Ktemp =(float)Vdiod / 295; |
|
|
|
|
03.04.2018, 17:35
|
|
Прописка
Регистрация: 14.02.2010
Адрес: СССР
Сообщений: 286
Сказал спасибо: 141
Сказали Спасибо 51 раз(а) в 43 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от Eddy71
|
Ktemp =(float)(Vdiod / 295);
|
Хм, я мне с первого взгляда пришло в голову "volatile"....
Когда-то тоже мучился с "оптимизацией" вычислений компилятором.
upd: Правда, не помню - где её ставить. Давно не писал. ЕСЛИ НЕ ОШИБАЮСЬ - это именно отключение оптимизации.
Хотя, по скобкам - у Вас всё считается правильно:
1. делим инт на инт
2. пытаемся преобразовать в float
Последний раз редактировалось Old_Monster; 03.04.2018 в 18:02.
|
|
|
Сказали "Спасибо" Old_Monster
|
|
|
09.04.2018, 21:37
|
|
Частый гость
Регистрация: 11.10.2015
Сообщений: 40
Сказал спасибо: 12
Сказали Спасибо 169 раз(а) в 27 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
PCWHD 5.078
https://cloud.mail.ru/public/AwdE/scuJwjwnx
Ошибку с TX буфером в RS232 Проверю позже, после отпишусь.
|
|
|
Эти 5 пользователя(ей) сказали Спасибо wolfeldt за это сообщение:
|
|
|
10.04.2018, 15:06
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от Eddy71
|
Прикольно, но только что сам до этого дошел. Точка с нулем сработала
|
Во-первых, ноль не обязателен. Хватило бы только точки.
Во-вторых, не рекомендую на МК пользоваться арифметикой с плавающей запятой. Очень она медленная и отжирает кучу памяти. А ведь почти всегда можно обойтись целочисленной арифметикой.
|
|
|
|
10.04.2018, 16:30
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от ptr
|
Во-вторых, не рекомендую на МК пользоваться арифметикой с плавающей запятой. Очень она медленная и отжирает кучу памяти. А ведь почти всегда можно обойтись целочисленной арифметикой.
|
Где ещё твои рекомендации почитать можно? Ковыряние в числах двойной точности на убитых восьмибитках мало чем уже будет отличаться от ковыряния в типа целочисленной арифметике.
|
|
|
|
11.04.2018, 00:54
|
|
Частый гость
Регистрация: 11.10.2015
Сообщений: 40
Сказал спасибо: 12
Сказали Спасибо 169 раз(а) в 27 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Вообще в CCS есть тип с фиксированной точкой, если кол-во знаков после точки определено. Так же в printf есть модификатор, который позволяет разбивать целое число на 2 части, разделенные точкой.
И что за ненависть к float-ам на МК.
Если задача занимается вычислениями и не требует реал-тайм операций, почему бы и нет, памяти съедает много, это да, но если мк позволяет.
Когда делал хронограф для измерения скорости пули, даже мыслей не возникло с целочисленными делать, так как смысла не было никакого, оптимизация там, где она не нужна.
Так что вот так убеждать что 8 бит Мк не предназначены для операций с плавающей точкой немного не корректно. Тут скорее не к МК, а к задаче
им выполняемой привязано всё.
Ktemp =(float)(Vdiod / 295); ‹- Тут мы сначала делим, а потом приводим тип к float. А так как деление целочисленное, то результат не корректный.
Ktemp =(float)Vdiod / 295.0; ‹- Тут мы сначала приводим тип int16 к float, и затем выполняем деление уже с плавающей точкой, что собственно и нужно. (интересный факт, умножение float быстрей чем сложение =)))
А писать 295.0 , а не 295, это скорее правило хорошего тона и оформления.
|
|
|
Сказали "Спасибо" wolfeldt
|
|
|
11.04.2018, 11:23
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от wolfeldt
|
И что за ненависть к float-ам на МК.
Если задача занимается вычислениями и не требует реал-тайм операций, почему бы и нет, памяти съедает много, это да, но если мк позволяет.
|
А где Вы ненависть увидели? Я только рекомендовал не пользоваться ей. Известно, что использование арифметики с плавающей запятой увеличивает размер кода на 3-4 килобайта, а скорость арифметики с плавающей запятой, относительно целочисленной арифметики на long для 8-битных МК, в 3-4 раза медленней.
Хотя не могу не признать, что бывают случаи, когда требуется именно арифметика с плавающей запятой и заменить ее арифметикой с фиксированной запятой чрезвычайно трудоемко или бессмысленно. Но это уже скорее исключение, чем правило.
Если Вы сразу для проекта используете МК с явным излишеством памяти и производительности, то, естественно, можете об этом не задумываться. А вот на младших PIC, ATTiny или STM8 такое расточительство часто вылазит боком.
Если выражаться более конкретно, то для тиражируемых решений выгодней потратить лишние 15-30 минут работы на целочисленную арифметику, чем по доллару на каждый МК в тираже. Для хобби проектов - тем более. Потому как в них, с одной стороны, никогда не известен весь набор функций, возлагаемых на МК и код будет не раз расширятся и улучшаться, с другой стороны - полезно приучать себя сразу писать оптимально, если эта оптимальность не требует увеличения затрат времени на кодирование свыше, чем 50%. Потому что на оптимизацию уже написанного кода потом потратите в разы больше времени, чем на его проектирование оптимальным сразу.
На самом деле такой подход оправдан при любом программировании. А то я уже утомился оптимизировать чужой код, получая, нередко, выигрыш в производительности на порядок, а то и на два-три )
P.S. Я в курсе, что некоторые считают, что даже диммер для лампочки надо делать на, как минимум, на STM32. Ну тут уже - "любой каприз за Ваши деньги" )))
P.P.S. Ах да, собственно сама библиотека: https://code.google.com/archive/p/libfixmath/
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ptr за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:45.
|
|