arc4random()
u_int32_t
man ページによるとa が返さarc4random()%500-500
れるため、符号なし整数になり、500 を引くと非常に大きな正の値が得られます。代わりにこれを試してください:
float test = ((float)(arc4random() % 500))-500;
signed int を作成し、それを float にキャストするという回避策を作成しましたが、これがどのように/なぜ起こったのかを知っていただければ幸いです。
ライン全体を 1 つずつ見てください。まず、次のものがあります。
arc4random()
上で述べたように、これは unsigned int を返します。value を返すとしましょう12345
。次に、モジュラス演算子があるので、式は次のようになります。
12345 % 500
つまり345
。次に、500 を引きます。
345 - 500
あなたはそれがあなたに-155を与えると思うでしょうが、そうではありません-私たちはまだここで符号なし整数の領域で作業しているので、あなたは本当に得ます4294967141
(またはそのようなもの-私の数学は間違っているかもしれません)。最後に、それをフロートに割り当てます。
float test = 4294967141;
float の仮数部は 23 ビットしかないため、格納される値test
は一般的に 4294967141 付近になりますが、4294970000 のように精度は低くなります。