Заголовок , стандартизированный в C 1999, предоставляет общие вызовы для подпрограмм в и . После того как вы включите , исходный текст «sin (x)» будет вызывать sinl, если x - это long double, sin, если x - double, и sinf, если x - float.
Вам все равно нужно будет обусловить свои константы, чтобы вы могли использовать «3.1» или «3.1f» в зависимости от ситуации. Для этого существует множество синтаксических техник, в зависимости от ваших потребностей и того, что кажется вам более эстетичным. Для констант, которые точно представлены в точности с плавающей точкой, вы можете просто использовать форму с плавающей точкой. Например, "y = .5f * x" автоматически преобразует .5f в .5, если x равен двойному. Однако «грех (.5f)» будет производить sinf (.5f), который менее точен, чем грех (.5).
Возможно, вы сможете сократить условную обработку до единого четкого определения:
#if defined USE_FLOAT
typedef float Float;
#else
typedef double Float;
#endif
Тогда вы можете использовать константы таким образом:
const Float pi = 3.14159265358979323846233;
Float y = sin(pi*x);
Float z = (Float) 2.71828182844 * x;
Это может быть не совсем удовлетворительным, поскольку в редких случаях число, преобразованное в двойное, а затем в плавающее, является менее точным, чем число, преобразованное непосредственно в плавающее. Поэтому вам может быть лучше использовать макрос, описанный выше, где «C (цифра)» добавляет суффикс к цифре, если необходимо.