3
float test=-1;

产生一个float带有值的-1。然而,

float test=arc4random()%500-500;

产生巨大的值,这显然是由缓冲区溢出引起的——数字环绕。这不应该发生在float; 为了踢球,我试图看看 Xcode 是否会让我做一个“签名的浮点数”,但它告诉我“浮点数不能被签名或未签名”。

我制作了一个解决方法,在其中我做了一个签名int,然后将其转换为一个float,但我真的很感激知道这是如何/为什么发生的。

4

2 回答 2

10

arc4random()u_int32_t根据手册页返回 a ,所以arc4random()%500-500将是一个无符号整数,减去 500 会给你一个非常大的正值。试试这个:

float test = ((float)(arc4random() % 500))-500;

我制作了一个变通方法,在其中创建了一个带符号的 int,然后将其转换为浮点数,但我真的很感激知道这是如何/为什么发生的。

一次查看整条线。首先,你有:

arc4random()

正如我上面所说,它返回一个无符号整数。让我们假设它返回 value 12345。接下来,您有模数运算符,因此您的表达式类似于:

12345 % 500

也就是说345。接下来,减去 500:

345 - 500

你会认为这会给你 -155,但不——我们仍然在无符号整数领域工作,所以你真的得到4294967141了(或类似的东西——我的数学可能不正确)。然后,最后,将其分配给浮点数:

float test = 4294967141;

浮点数只有 23 位用于尾数,因此存储的值test将在 4294967141 的一般邻域内,但精度较低,如 4294970000。

于 2012-07-09T19:11:27.457 回答
0

Objective-C 中的浮点数与 C 中的浮点数完全相同:按照 IEEE-754 的定义进行固有签名。http://en.wikipedia.org/wiki/Single_precision_floating-point_format

于 2012-07-09T19:13:40.840 回答