你如何让modf或modff正常工作?

时间:2012-11-17 21:08:59

标签: 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,但确实如此。

1 个答案:

答案 0 :(得分:3)

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

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

(这假设数字不是负数。)

但是,由于你在这里处理整数,并且浮点运算很昂贵,你应该考虑使用模运算符(它对整数运算):

int pickName = entryCount % 10;