objective-c - 如何让 modf 或 modff 正常工作?

标签 objective-c c

我只是想通过取计数器相对于列表长度的模数,使用递增计数器循环遍历 (10) 个名称的列表。但是,代码似乎在这里和那里跳过了一个数字。我尝试了 modf() 和 modff() 以及不同类型的转换,但没有成功。

代码示例如下:

defaultNameList = [NSArray arrayWithObjects:@"RacerX",@"Speed",@"Sprittle",@"Chim-Chim",@"Pops",@"Dale",@"Junior",@"Chip",@"Fred",@"Barney", nil];

float intpart;
int pickName = (int)(modff(entryCount/10.0,&intpart) * 10.0);
NSLog(@"%ld %f %f %f %d %@",entryCount, entryCount/10.0, modff(entryCount/10.0,&intpart), modff(entryCount/10.0,&intpart) * 10.0 ,pickName, [defaultNameList objectAtIndex:pickName]);

控制台给出:

 0 0.000000 0.000000 0.000000 0 RacerX
 1 0.100000 0.100000 1.000000 1 Speed
 2 0.200000 0.200000 2.000000 2 Sprittle
 3 0.300000 0.300000 3.000000 3 Chim-Chim
 4 0.400000 0.400000 4.000000 4 Pops
 5 0.500000 0.500000 5.000000 5 Dale
 6 0.600000 0.600000 6.000000 6 Junior
 7 0.700000 0.700000 7.000000 6 Junior
 8 0.800000 0.800000 8.000000 8 Fred
 9 0.900000 0.900000 9.000000 8 Fred
 10 1.000000 0.000000 0.000000 0 RacerX

据我所知,它不应该跳过 pickName = 7 或 9,但确实如此。

最佳答案

转换为 (int) 会截断文件。也就是说,如果在实际架构上使用的 float 系统中不能精确表示,并且比精确值小一点,就会向零取整。要解决此问题,请将数字四舍五入而不是截断:

int pickName = (int)(modff(entryCount / 10.0, &intpart) * 10.0 + 0.5);

(假设数字不是负数。)

但是,由于您在这里使用的是整数,而浮点运算的开销很大,因此您应该考虑改用模运算符(对整数进行运算):

int pickName = entryCount % 10;

关于objective-c - 如何让 modf 或 modff 正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434809/

相关文章:

c - 为什么 NULL 条件在 3 个字符后终止

c - 在多线程程序中在哪里定义互斥锁,有什么区别

c - 以下相关循环的时间复杂度是多少?

c - 没有打印任何内容

c++ - Arduino 使用 C 还是 C++?

ios - 如何在 UIWebview 中使用 SDWebimage 的缓存图像

ios - 您如何查看 Instruments 8.2 中何时释放内存

ios - Base 64解码产生空

html - 在 Objective C 中将 RTF 文件转换为 HTML

objective-c - 为什么我不能在 iOS 中删除 NSMutableArray 的所有对象?