【问题标题】:CGFloat: round, floor, abs, and 32/64 bit precisionCGFloat:圆形、地板、abs 和 32/64 位精度
【发布时间】:2011-10-08 05:08:27
【问题描述】:

TLDR:如何以编译 32 位和 64 位 CGFloats 而没有警告的方式调用标准浮点代码?


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

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

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

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

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

【问题讨论】:

    标签: objective-c cgfloat


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    如果你只需要几个函数,你可以使用这个来代替:

    #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
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      相关资源
      最近更新 更多