CGFloat:round、floor、abs 和 32/64 位精度

发布于 2024-12-08 18:53:24 字数 436 浏览 0 评论 0原文

TLDR:如何以编译 32 位和 64 位 CGFloats 且不发出警告的方式调用标准浮点代码?


CGFloat 定义为 double 或 float,具体取决于编译器设置和平台。我正在尝试编写在这两种情况下都能正常工作的代码,而不会生成大量警告。

当我使用下限、abs、ceil 等函数和其他简单的浮点运算时,我会收到有关值被截断的警告。例如:

警告:隐式转换将 64 位值缩短为 32 位值

我不关心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本( Floor 而不是 Floorf 等);然而,我不得不容忍这些错误。

有没有一种方法可以干净地编写支持 32 位和 64 位浮点数的代码,而不必使用大量 #ifdef __ LP64 __ ,或为所有标准浮点函数编写包装函数?

TLDR: How do I call standard floating point code in a way that compiles both 32 and 64 bit CGFloats without warnings?


CGFloat is defined as either double or float, depending on the compiler settings and platform. I'm trying to write code that works well in both situations, without generating a lot of warnings.

When I use functions like floor, abs, ceil, and other simple floating point operations, I get warnings about values being truncated. For example:

warning: implicit conversion shortens 64-bit value into a 32-bit value

I'm not concerned about correctness or loss of precision in of calculations, as I realize that I could just use the double precision versions of all functions all of the time (floor instead of floorf, etc); however, I would have to tolerate these errors.

Is there a way to write code cleanly that supports both 32 bit and 64 bit floats without having to either use a lot of #ifdef __ LP64 __ 's, or write wrapper functions for all of the standard floating point functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

指尖凝香 2024-12-15 18:53:24

您可以使用 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'.

You may use those functions from 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'.
慢慢从新开始 2024-12-15 18:53:24

如果你只需要几个功能,你可以使用这个:

#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

If you only need a few functions you can use this instead:

#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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文