我有:
r = ((float)(rand()/(float)(RAND_MAX)) * BOUND);
这也给出了同样的警告:
r = ((rand()/(float)(RAND_MAX)) * BOUND);
警告:
conversion to ‘float’ from ‘int’ may alter its value
任何可能的修复方法?
答案 0 :(得分:0)
您收到此警告是因为float
变量没有足够的精度来保存int
可能带来的任何可能值。这意味着如果您从中投射的整数太大,则强制转换可能会产生错误的结果。例如,像1 000 000 451
这样的整数将转换为1.000000E9
,使451
错误。根据您RAND_MAX
的值,这可能会或可能不会在您的具体情况下出现问题。
使用double
代替更安全,不应该有这个问题。
答案 1 :(得分:0)
RAND_MAX
和rand()
本身的返回值都属于int
类型。
32位int
的最大值(INT_MAX
)最多可达十位数。
A float
- 通常实现为32位FP - 具有大约6位精度。
这意味着没有足够的精度来区分,例如2,147,483,64 7 来自2,147,483,64 6 。这就是编译器生成该警告的原因:您的转换对所有情况都不安全。
快速解决方法是使用double
,它通常实现为64位FP,具有大约15位精度。这足以容纳32位int
(但不足以容纳64位)。
总而言之,rand()
是一个糟糕的功能,标准也允许它在“随机性”上非常糟糕。如果您需要好的随机数,则不应该依赖标准库,而应使用专用的第三方解决方案(通常包括立即返回浮点的函数)。