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_MAX
和 rand()
的 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 浮点数的函数).
我有:
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_MAX
和 rand()
的 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 浮点数的函数).