相关疑难解决方法(0)

浮动和双重比较最有效的方法是什么?

比较两个double或两个float值的最有效方法是什么?

简单地这样做是不正确的:

bool CompareDoubles1 (double A, double B)
{
   return A == B;
}
Run Code Online (Sandbox Code Playgroud)

但是像这样:

bool CompareDoubles2 (double A, double B) 
{
   diff = A - B;
   return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)

似乎浪费处理.

有谁知道更聪明的浮动比较器?

c++ algorithm floating-point optimization

495
推荐指数
13
解决办法
39万
查看次数

将'浮动'转换为NSNumber,返回'浮动'的精度损失

我似乎在Objective-C中遇到一个奇怪的问题,将浮点数转换为NSNumber(为方便起见将其包装),然后将其转换回浮点数.

简而言之,我的一类有一个属性red,这是一个浮动0.01.0:

@property (nonatomic, assign) float red;
Run Code Online (Sandbox Code Playgroud)

此对象将自身与从磁盘加载的值进行比较,以进行同步.(该文件可以在应用程序之外进行更改,因此它会定期检查文件更改,将备用版本加载到内存中,并进行比较,合并差异.)

这是一个有趣的片段,其中比较了两个值:

if (localObject.red != remoteObject.red) {
    NSLog(@"Local red: %f Remote red: %f", localObject.red, remoteObject.red);
}
Run Code Online (Sandbox Code Playgroud)

这是我在日志中看到的内容:

2011-10-28 21:07:02.356 MyApp[12826:aa63] Local red: 0.205837 Remote red: 0.205837
Run Code Online (Sandbox Code Playgroud)

奇怪的.对?这段代码是如何执行的?

存储在文件中的实际值:

...red="0.205837"...
Run Code Online (Sandbox Code Playgroud)

转换为float使用:

currentObject.red = [[attributeDict valueForKey:@"red"] floatValue];
Run Code Online (Sandbox Code Playgroud)

在代码的另一个点上,我能够从GDB中截取屏幕截图.它被打印到NSLog中:(这也是它在磁盘上的文件中显示的精度.)

2011-10-28 21:21:19.894 MyApp[13214:1c03] Local red: 0.707199 Remote red: 0.707199
Run Code Online (Sandbox Code Playgroud)

但在调试器中显示为:

GDB截图

如何在属性级别获取此级别的精度,但不是存储在文件中,还是在NSLog中正确打印?为什么它似乎变化了?

floating-point cocoa objective-c nsnumber

9
推荐指数
1
解决办法
2365
查看次数