В моем конкретном случае я сначала разработал программу для работы на микроконтроллере Texas Instruments (TMS320F28335). Это был симулятор синхронного генератора в реальном времени, поэтому ему нужно было выполнять большое количество операций с плавающей запятой. Я не указывал никакого суффикса для констант с плавающей запятой, поэтому они обрабатывались как двойные (я думаю, это то, что говорят стандарты C), но компилятор, предоставленный Texas Instruments, реализует эти двойные числа как 32-битные числа с плавающей запятой, поэтому FPU микроконтроллера (см. Таблицу 6-1 из руководства пользователя компилятора) скажем так, эффективно. Затем мне пришлось перенести эту программу на BeagleBone Black со встроенным Linux (исправленным для требований реального времени). Конечно, все константы снова обрабатывались компилятором (GCC) как удвоения, но в данном случае это означало не 32-битные числа с плавающей запятой, а 64-битные числа с плавающей запятой. Я не совсем понимаю, как работает FPU ARM Cortex A8, но, насколько я читал (и поскольку это 32-битный процессор), производительность была бы улучшена, если бы эти константы с плавающей запятой обрабатывались как 32-битные числа с плавающей запятой. . Итак, все это привело меня к вопросу: есть ли способ сделать более переносимые константы с плавающей запятой «лучшего типа»? В этом случае я бы решил проблему, добавив суффикс «f» к каждой константе, потому что оба процессора более эффективны (я думаю) при обработке с плавающей запятой, но если я разрабатываю что-то на ПК с amd64 и хочу портировать это к 32-битному микроконтроллеру, есть ли способ добавить суффикс, который можно было бы изменить на «f» для 32-битных микроконтроллеров и «l» для ПК amd64? Я подумал о чем-то вроде этого (конечно, это не работает):
заголовочный файл, зависящий от архитектуры, для 32-битного микроконтроллера:
#define BEST_TYPE f
.
.
.
заголовочный файл, зависящий от архитектуры, для ПК amd64:
#define BEST_TYPE l
.
.
.
независимый от архитектуры исходный файл:
.
.
.
a = b * 0.1BEST_TYPE;
.
.
.
Чтобы уточнить, под «лучшим типом» я имел в виду более точный числовой тип данных, поддерживаемый FPU микропроцессора.
double
должен быть самым точным, переносимым. - person Lundin   schedule 14.11.2019#define BEST_TYPE(x) ((float)(x))
. Затем вы можете использоватьa = b * BEST_TYPE(0.1);
в своем независимом от архитектуры исходном файле. - person Ian Abbott   schedule 14.11.2019double
, а затем вfloat
. Это может дать менее точный результат, чем прямое преобразование вfloat
. Лучше добавить суффикс для обозначения типа, например,#define BEST_TYPE(x) x##f
. - person Eric Postpischil   schedule 14.11.2019