gpt4 book ai didi

objective-c - 在 NSMutableArray 中存储 float 会产生意想不到的结果

转载 作者:行者123 更新时间:2023-12-03 17:36:35 25 4
gpt4 key购买 nike

我正在编写一个方法来计算一系列事件(特别是 iPhone 中的按钮点击)之间的平均时间间隔。由于我想要平均的时间间隔数可能会在程序的生命周期中发生变化,因此我将时间读数存储在名为 tapTimes 的类型为 NSMutableArray 的对象中,因此我不这样做不必担心管理数组大小。

当我将时间读数存储为 double 时,一切正常(为简单起见,在下面的示例中我只对一个时间间隔感兴趣):

CFAbsoluteTime time = CFAbsoluteTimeGetCurrent();
[tapTimes addObject:[NSNumber numberWithDouble:(double)time]];
[tapTimes removeObjectAtIndex:0];
double deltaT = [[tapTimes objectAtIndex:1] doubleValue] - [[tapTimes objectAtIndex:0] doubleValue];

对于每秒左右点击一次,给出(第一个值只是自数组用零初始化以来的第一次读取):

deltaT 311721948.947153
deltaT 1.023200
deltaT 1.080004
deltaT 1.055961
deltaT 1.087942
deltaT 1.080074

但是,如果我存储 float :

CFAbsoluteTime time = CFAbsoluteTimeGetCurrent();
[tapTimes addObject:[NSNumber numberWithFloat:(float)time]];
[tapTimes removeObjectAtIndex:0];
float deltaT = [[tapTimes objectAtIndex:1] floatValue] - [[tapTimes objectAtIndex:0] floatValue];

然后我得到了 deltaT 的意外结果:

deltaT 311721760.000000
deltaT 0.000000
deltaT 0.000000
deltaT 0.000000
deltaT 0.000000
deltaT 32.000000
deltaT 0.000000
deltaT 0.000000
deltaT 0.000000

知道出了什么问题吗? (我正在 Objective-c/cocoa 中做 mt 第一步,所以我希望答案不是太微不足道:))

最佳答案

问题是 float 不够精确,无法区分一个时间戳和一秒后的时间戳。坚持doubleCFAbsoluteTime 使用该类型是有原因的。

以下是 64 位 10.6.4 下的问题演示:

val: 311721760.000000 - val2: 311721761.000000 - (val2 - val): 1.000000
v: 311721760.000000 - v2: 311721760.000000 - (v2 - v): 0.000000

第一行使用double值; val2 是通过将 1 添加到 val 生成的。第二行使用 float 值。源码如下:

//clang so_float.m -o so_float
#import <stdio.h>

int
main(void) {
double val = 311721760.000000;
double val2 = val + 1.0;
fprintf(stderr, "val: %f - val2: %f - (val2 - val): %f\n", val, val2, val2 - val);
float v = val;
float v2 = val + 1.0;
fprintf(stderr, "v: %f - v2: %f - (v2 - v): %f\n", v, v2, v2 - v);
return 0;
}

关于objective-c - 在 NSMutableArray 中存储 float 会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com