CGFloat: круглая, напольная, abs и 32/64 битная точность - PullRequest
11 голосов
/ 08 октября 2011

TLDR: как вызвать стандартный код с плавающей запятой таким образом, чтобы компилировать 32- и 64-битные CGFloats без предупреждений?


CGFloat определяется как double или float, в зависимости от настроек компилятораи платформа.Я пытаюсь написать код, который хорошо работает в обеих ситуациях, не генерируя много предупреждений.

Когда я использую такие функции, как floor, abs, ceil и другие простые операции с плавающей запятой, я получаю предупреждения о значенияхбыть усеченным.Например:

предупреждение: неявное преобразование сокращает 64-битное значение до 32-битного

Меня не беспокоит правильность или потеря точности вычислений, поскольку я понимаю, что я мог бы просто использовать версии всех функций двойной точности все время (floor вместо floorf и т. д.);однако я должен был бы терпеть эти ошибки.

Есть ли способ написать чистый код, который поддерживает как 32-битные, так и 64-битные операции с плавающей запятой, без необходимости использования большого количества #ifdef __ LP64 __, илинаписать функции-оболочки для всех стандартных функций с плавающей запятой?

Ответы [ 2 ]

19 голосов
/ 08 октября 2011

Вы можете использовать эти функции из tgmath.h.

#include <tgmath.h>

...

double d = 1.5;
double e = floor(d);   // will choose the 64-bit version of 'floor'

float f = 1.5f;
float g = floor(f);    // will choose the 32-bit version of 'floorf'.
3 голосов
/ 05 января 2015

Если вам нужно всего несколько функций, вы можете использовать это вместо:

#if CGFLOAT_IS_DOUBLE
#define roundCGFloat(x) round(x)
#define floorCGFloat(x) floor(x)
#define ceilCGFloat(x) ceil(x)
#else
#define roundCGFloat(x) roundf(x)
#define floorCGFloat(x) floorf(x)
#define ceilCGFloat(x) ceilf(x)
#endif
...