我正在尝试制作基于时间的绘图。例如:定义一个点供以后使用。
CGPoint testPoint = CGPointMake(2341.2345, 1350046324.1234);
然后 testPoint.y 变为 1350046336.00 ,这不是我们放在那里的。我正在使用 Xcode 4.5。有任何想法吗?谢谢。
我正在尝试制作基于时间的绘图。例如:定义一个点供以后使用。
CGPoint testPoint = CGPointMake(2341.2345, 1350046324.1234);
然后 testPoint.y 变为 1350046336.00 ,这不是我们放在那里的。我正在使用 Xcode 4.5。有任何想法吗?谢谢。
CGPoint
定义在CGGeometry.h
:
struct CGPoint {
CGFloat x;
CGFloat y;
};
在 32 位系统上CGFloat
是. iPhone/iPad 是 32 位系统。最后一条信息 - C 中的数字(目标 C 是 C 的严格超集):typedef
float
float
C 中的浮点数使用 IEEE 754 编码。由于这种编码,您永远无法保证您的价值不会发生变化。
你可以在这里阅读整个讨论:float vs. double precision
CGPoint 使用浮点(32 位)数据类型(至少在 iOS6 上)。
从标题:
CGPointMake(CGFloat x, CGFloat y) ...
和
typedef CGFLOAT_TYPE CGFloat;
和
# define CGFLOAT_TYPE float
所以这导致我的测试代码:
CGPoint testPoint1 = CGPointMake(2341.2345, 1350046324.1234);
CGPoint testPoint2 = CGPointMake(2341.2345f, 1350046324.1234f);
double d = 1350046324.1234;
float f = 1350046324.1234;
NSLog(@"%f %f %f %f", testPoint1.y, testPoint2.y, d, f);
打印到日志:
1350046336.000000 1350046336.000000 1350046324.123400 1350046336.000000
所以你只是离开了单精度浮点数足够好的数字范围。就这样。
顺便说一句:在我偶然发现你的问题之前,我确实认为 CGFloat 是双倍的。
如果你写:
CGPoint testPoint = CGPointMake(2341.2345f, 1350046324.1234f);
好点吗 ?