VladislavS 39 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба О какой архитектуре речь идёт? У IAR для ARM с С++17, а соответственно и с вычислениями на этапе компиляции, уже очень даже терпимо. Остальные архитектуры сильно запаздывают в этом плане. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexey_N 0 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба 22 minutes ago, VladislavS said: О какой архитектуре речь идёт? У IAR для ARM с С++17, а соответственно и с вычислениями на этапе компиляции, уже очень даже терпимо. Остальные архитектуры сильно запаздывают в этом плане. Да, сорри, сразу не указал. Речь про AVR. Меги простейшие - 8515, 16А, и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба double на AVR. Ну-ну... Пиши (1L<<31) и не выпендривайся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба Расчеты frequency tuning word для разнообразных DDS (формула напомнила) вполне работают на базе 64-разрядных целых (uint64_t например). Даже на AVR. /* функция преобразования требуемой частоты в FTW при заданной тактовой частоте DDS */ /* divider - это делитель опорной частоты перед DDS, умноженный на делитель выходной частоты ЗА DDS. */ static ftw_t freq2ftw(uint_fast32_t freq, uint_fast16_t divider, uint_fast64_t ddsosc) { const uint_fast64_t d = (uint_fast64_t) divider << FTW_RESOLUTION; return (freq * d) / ddsosc; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба 7 часов назад, x893 сказал: #define FREQ_COEFF ((1 << 32) / FCLK) нельзя ? Нельзя. Надо #define FREQ_COEFF ((1ull << 32) / FCLK) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 15 июня, 2019 Опубликовано 15 июня, 2019 · Жалоба 42 минуты назад, GenaSPB сказал: Расчеты frequency tuning word для разнообразных DDS (формула напомнила) вполне работают на базе 64-разрядных целых (uint64_t например). const uint_fast64_t d = (uint_fast64_t) divider << FTW_RESOLUTION; Интересно: зачем тут const? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 4 часа назад, jcxz сказал: #define FREQ_COEFF ((1ull << 32) / FCLK) Господа, я конечно понимаю, выходные и всё такое, но почему <<32 ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 8 hours ago, jcxz said: Нельзя. Надо #define FREQ_COEFF ((1ull << 32) / FCLK) Это понятно что ULL. Я для примера написал только. Можно и ((uint64_t)1) << 32 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 16 июня, 2019 Опубликовано 16 июня, 2019 (изменено) · Жалоба 9 hours ago, jcxz said: зачем тут const? Для программиста. Или для "красоты". При целочисленной вычисление отдельного множителя не годится. Только формулой с требуемой частотой. А то слишком падает точность. Изменено 16 июня, 2019 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 2 часа назад, x893 сказал: Это понятно что ULL. Я для примера написал только. Можно и ((uint64_t)1) << 32 Можно для чего? Мне кажется Вы плохо разбираетесь в обсуждаемом вопросе. Между: #define FREQ_COEFF ((1ull << 32) / FCLK) и #define FREQ_COEFF (((uint64_t)1 << 32) / FCLK) огромная разница. Первое - более универсально, чем 2-е. Второе во многих случаях применять нельзя. Изучайте си чтобы узнать почему! И не зная куда автор потом использует это своё FREQ_COEFF ваш вариант там может не работать. Мой будет работать везде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 23 minutes ago, jcxz said: Можно для чего? Мне кажется Вы плохо разбираетесь в обсуждаемом вопросе. Между: #define FREQ_COEFF ((1ull << 32) / FCLK) и #define FREQ_COEFF (((uint64_t)1 << 32) / FCLK) огромная разница. Первое - более универсально, чем 2-е. Второе во многих случаях применять нельзя. Изучайте си чтобы узнать почему! И не зная куда автор потом использует это своё FREQ_COEFF ваш вариант там может не работать. Мой будет работать везде. Что бы ТС понял что кроме pow() есть обычный способ. А ULL в конце или uint64_t это уже только профессионалы программирования объясняют. Такие мелочи самому нужно понимать. Буду учить, учить, и учить С, а то за 30 лет еще не всё выучил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 10 часов назад, jcxz сказал: огромная разница. Первое - более универсально, чем 2-е. Интересно узнать. Объясните. На полном серьезе. Не считая того, что ull на какой-то платформе может оказаться меньше 64 бит. В чем большая универсальность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 22 минуты назад, Сергей Борщ сказал: Интересно узнать. Объясните. На полном серьезе. Не считая того, что ull на какой-то платформе может оказаться меньше 64 бит. В чем большая универсальность? Константу полученную по 1-му варианту можно использовать внутри выражений директив препроцессора, тех которые требуют вычисления выражения. Например: #if, #elif. Константу из 2-го варианта там использовать нельзя. Т.е. - при первом варианте #if FREQ_COEFF > 10 препроцессор нормально слопает. При 2-м варианте выдаст ошибку компиляции. И далее - все остальные макросы порождённые из FREQ_COEFF станут также неприменимы в #if если само FREQ_COEFF будет неприменимо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 17 июня, 2019 Опубликовано 17 июня, 2019 · Жалоба 9 часов назад, jcxz сказал: Константу полученную по 1-му варианту можно использовать внутри выражений директив препроцессора, тех которые требуют вычисления выражения. Понятно. да, не подумал. Тогда ловлю вас на противоречии самому себе В 15.06.2019 в 13:16, jcxz сказал: Препроцессор всегда выполняет только текстовую подстановку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 17 июня, 2019 Опубликовано 17 июня, 2019 · Жалоба Можно посмотреть текст после препроцессора и понять, что идет в компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться