float test=-1;
产生一个float
带有值的-1
。然而,
float test=arc4random()%500-500;
产生巨大的值,这显然是由缓冲区溢出引起的——数字环绕。这不应该发生在float
; 为了踢球,我试图看看 Xcode 是否会让我做一个“签名的浮点数”,但它告诉我“浮点数不能被签名或未签名”。
我制作了一个解决方法,在其中我做了一个签名int
,然后将其转换为一个float
,但我真的很感激知道这是如何/为什么发生的。
float test=-1;
产生一个float
带有值的-1
。然而,
float test=arc4random()%500-500;
产生巨大的值,这显然是由缓冲区溢出引起的——数字环绕。这不应该发生在float
; 为了踢球,我试图看看 Xcode 是否会让我做一个“签名的浮点数”,但它告诉我“浮点数不能被签名或未签名”。
我制作了一个解决方法,在其中我做了一个签名int
,然后将其转换为一个float
,但我真的很感激知道这是如何/为什么发生的。
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。
Objective-C 中的浮点数与 C 中的浮点数完全相同:按照 IEEE-754 的定义进行固有签名。http://en.wikipedia.org/wiki/Single_precision_floating-point_format