Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 03.04.2018, 13:32  
Eddy71
Почётный гражданин KAZUS.RU
 
Аватар для Eddy71
 
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,558
Сказал спасибо: 5,394
Сказали Спасибо 24,765 раз(а) в 5,560 сообщении(ях)
Eddy71 на пути к лучшему
По умолчанию 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/
Eddy71 вне форума  
Непрочитано 03.04.2018, 13:45  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 679
Сказал спасибо: 362
Сказали Спасибо 753 раз(а) в 358 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

или
Ktemp = Vdiod / 295.0;
или
Ktemp =((float)Vdiod) / 295.0;
j-Roger вне форума  
Сказали "Спасибо" j-Roger
Eddy71 (03.04.2018)
Непрочитано 03.04.2018, 13:57  
Eddy71
Почётный гражданин KAZUS.RU
 
Аватар для Eddy71
 
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,558
Сказал спасибо: 5,394
Сказали Спасибо 24,765 раз(а) в 5,560 сообщении(ях)
Eddy71 на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

Прикольно, но только что сам до этого дошел. Точка с нулем сработала
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/

моя домашняя страничка: http://www.eddy.com.ua/

Последний раз редактировалось Eddy71; 03.04.2018 в 14:22.
Eddy71 вне форума  
Непрочитано 03.04.2018, 16:08  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

Сообщение от j-Roger Посмотреть сообщение
или
Ktemp = Vdiod / 295.0;
или
Ktemp =((float)Vdiod) / 295.0;
Во втором варианте '.0' здесь лишние
Код:
Ktemp =(float)Vdiod / 295;
Bill вне форума  
Сказали "Спасибо" Bill
Eddy71 (09.04.2018)
Непрочитано 03.04.2018, 17:35  
Old_Monster
Прописка
 
Регистрация: 14.02.2010
Адрес: СССР
Сообщений: 286
Сказал спасибо: 141
Сказали Спасибо 51 раз(а) в 43 сообщении(ях)
Old_Monster на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" Old_Monster
Eddy71 (09.04.2018)
Непрочитано 09.04.2018, 21:37  
wolfeldt
Частый гость
 
Регистрация: 11.10.2015
Сообщений: 40
Сказал спасибо: 12
Сказали Спасибо 169 раз(а) в 27 сообщении(ях)
wolfeldt на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

PCWHD 5.078
https://cloud.mail.ru/public/AwdE/scuJwjwnx
Ошибку с TX буфером в RS232 Проверю позже, после отпишусь.
wolfeldt вне форума  
Эти 5 пользователя(ей) сказали Спасибо wolfeldt за это сообщение:
bolek4321 (12.04.2018), demanik (09.04.2018), Eddy71 (09.04.2018), vlad_ru (09.04.2018), welcome61 (09.04.2018)
Непрочитано 10.04.2018, 15:06  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

Сообщение от Eddy71 Посмотреть сообщение
Прикольно, но только что сам до этого дошел. Точка с нулем сработала
Во-первых, ноль не обязателен. Хватило бы только точки.
Во-вторых, не рекомендую на МК пользоваться арифметикой с плавающей запятой. Очень она медленная и отжирает кучу памяти. А ведь почти всегда можно обойтись целочисленной арифметикой.
ptr вне форума  
Непрочитано 10.04.2018, 16:30  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Изучение PIC C Compiler(CCS C)

Сообщение от ptr Посмотреть сообщение
Во-вторых, не рекомендую на МК пользоваться арифметикой с плавающей запятой. Очень она медленная и отжирает кучу памяти. А ведь почти всегда можно обойтись целочисленной арифметикой.
Где ещё твои рекомендации почитать можно? Ковыряние в числах двойной точности на убитых восьмибитках мало чем уже будет отличаться от ковыряния в типа целочисленной арифметике.
STM32F0 вне форума  
Непрочитано 11.04.2018, 00:54  
wolfeldt
Частый гость
 
Регистрация: 11.10.2015
Сообщений: 40
Сказал спасибо: 12
Сказали Спасибо 169 раз(а) в 27 сообщении(ях)
wolfeldt на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" wolfeldt
Eddy71 (11.04.2018)
Непрочитано 11.04.2018, 11:23  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию 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/
ptr вне форума  
Эти 2 пользователя(ей) сказали Спасибо ptr за это сообщение:
Eddy71 (11.04.2018), VLM (11.04.2018)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
i2c+ccs pic Gladkih Микроконтроллеры, АЦП, память и т.д 9 18.04.2016 22:17
PIC BASIC PRO Compiler 2.47 dosikus Proteus, KiCAD и другие ECAD 27 05.12.2009 05:48
изучение IAR AVR C compiler granel Микроконтроллеры, АЦП, память и т.д 0 10.10.2008 20:45
PIC C Compiler PCWH458 sergxxx Микроконтроллеры, АЦП, память и т.д 9 23.09.2008 18:25
Не включается дебаггер в CCS C Compiler BigMazzi Микроконтроллеры, АЦП, память и т.д 4 19.09.2008 13:34


Часовой пояс GMT +4, время: 11:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot