aze*_*ven 10 iphone floating-point objective-c ios
我想我会疯了."反击"和"间隔"都是双打.这发生在加速度计上:didAccelerate,间隔为(.01)."计数器"最终应增加到"间隔".由于某种原因,我不能得到这个"如果"响.
我忽略了什么吗?
double interval = .5;
 if( counter == interval ){ //should eventually be .50000 == .50000
  NSLog( @"Hit!" );
  [self playSound];
  counter = 0;
 }else{
  counter += .01;
 }
NSLog( @"%f, %f, %d",counter,interval,(counter == interval) );
Ada*_*ach 23
不要将双打或花车与平等进行比较 - 它们在您正在检查的有效数字的数量上可能看起来相同但计算机看得更多.
为此,Foundation Framework为不同类型提供"epsilon"值,例如"float"和"double".如果两个数字之间的距离小于epsilon,则可以假设这两个数字相等.
在您的情况下,您将使用它如下:
- (BOOL)firstDouble:(double)first isEqualTo:(double)second {
    if(fabs(first - second) < DBL_EPSILON)
        return YES;
    else
        return NO;
}
或者在Swift 4中:
func doublesAreEqual(first: Double, second: Double) -> Bool {
    if fabs(first - second) < .ulpOfOne {
        return true
    }
    return false
}
两个非常有用的链接:
在您的else块中,您不会添加0.01计数器,因为那不是可表示的双精度值。您实际上是在添加值:
0.01000000000000000020816681711721685132943093776702880859375
毫不奇怪,当您重复将此值添加到自身时,您永远不会得到0.5准确的值。
两种选择:更好的是将if条件替换为(counter >= interval)。或者,您可以使用 2 的小幂作为增量,而不是使用无法表示的东西,例如0.0078125。
| 归档时间: | 
 | 
| 查看次数: | 9490 次 | 
| 最近记录: |