2011-09-04 33 views
4

我试图在我的程序中递归添加一些CGFloat值。我只是在一个特定的场景中意识到生成的总数是不正确的。为了确保我的程序逻辑没有任何问题,我创建了一个该场景的简单示例(请参阅下文),并打印出相同的错误值。CGFloat添加bug?

CGFloat arr[3] = {34484000,512085280,143011440}; 
CGFloat sum = 0.0; 
sum = arr[0] + arr[1] + arr[2]; 

NSLog(@"%f",sum); 

int arr1[3] = {34484000,512085280,143011440}; 
int sum1 = 0.0; 
sum1 = arr1[0] + arr1[1] + arr1[2]; 

NSLog(@"%d",sum1); 

第一的NSLog打印689580736.000000 ......而正确的结果689580720.但是第二NSLog的打印正确的结果。我不确定这是一个错误还是我做错了什么。

谢谢, 穆拉利

回答

11

CGFloat是单精度浮点数在32个目标例如iOS - 它只有一个23位尾数,即约6 - 7显著数字。如果您需要更高的准确度,请使用双精度型。

在进一步学习编程之前,您应该先阅读David Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic

+1

对于正确和详细的答案+1。 – Till

+1

Paul,谢谢你的回答。我认为它必须处理一些限制问题。你的笔记澄清了它。我将它从CGFloat改为double,并打印出正确的结果。同样基于我刚刚阅读的其他信息 - 浮点数有7位数限制,双15/16和小数位数28/29位数限制。感谢这篇文章,我会在闲暇时阅读它。 –