2012-10-12 27 views
1

我试图做一个基于时间的绘图。例如:定义一个点供以后使用。当CGPointMake遇到大数字

CGPoint testPoint = CGPointMake(2341.2345, 1350046324.1234); 

然后testPoint.y变成1350046336.00这不是我们放在那里。 我正在使用Xcode 4.5。 任何想法?谢谢。

回答

1

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是双倍的。

+0

单精度,这就是问题所在!谢啦! – Globalhawk

0

如果你写:

CGPoint testPoint = CGPointMake(2341.2345f, 1350046324.1234f); 

是更好?

+0

将“f”放在结尾处将常量声明为(32位)float。 –

+0

不,这是一样的。 – Globalhawk

+0

对不起然后:) – Pierre

2

CGPointCGGeometry.h定义:

struct CGPoint { 
    CGFloat x; 
    CGFloat y; 
}; 

在32位系统CGFloattypedeffloat。 iPhone/iPad是一个32位系统。最后一条信息 - 目标C中的float号码(C是C的严格超集):

C中的浮点数使用IEEE 754编码。 由于这种编码,你永远不能保证你的 你的价值没有变化。

你可以在这里阅读整个讨论:float vs. double precision