Rand() 转换警告

Rand() Conversion Warning

我有:

r = ((float)(rand()/(float)(RAND_MAX)) *  BOUND);

这也给出了同样的警告:

r = ((rand()/(float)(RAND_MAX)) *  BOUND);

和警告:

 conversion to ‘float’ from ‘int’ may alter its value

任何可能的修复方法?

您收到此警告是因为 float 变量没有足够的精度来保存 int 可以采用的任何可能值。这意味着如果您从中转换的整数太大,则转换可能会产生错误的结果。例如,像 1 000 000 451 这样的整数将被转换为 1.000000E9,从而导致 451 错误。根据您 RAND_MAX 的值,在您的特定情况下,这可能是问题,也可能不是问题。

使用 double 会更安全,你不应该有这个问题。

RAND_MAXrand() 的 return 值本身都是 int.

类型

一个32位int可以有一个最大值(INT_MAX)最多十位。

A float——通常实现为 32 位 FP——具有大约 6 位精度。

这意味着没有足够的精度来区分例如2,147,483,647 来自 2,147,483,646。这就是编译器生成该警告的原因:您的转换并非对所有情况都是安全的。

快速修复是使用 double,它通常实现为 64 位 FP,精度约为 15 位。这足以容纳 32 位 int(但不足以容纳 64 位)。

总而言之,rand() 是一个糟糕的函数,标准允许它在 "randomness" 上也很糟糕。如果你需要 good 随机数,你不应该依赖标准库,而是使用专用的第三方解决方案(通常包括立即 return 浮点数的函数).