Rand()转换警告

时间:2015-11-01 22:42:42

标签: c random type-conversion c99

我有:

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

这也给出了同样的警告:

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

警告:

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

任何可能的修复方法?

2 个答案:

答案 0 :(得分:0)

您收到此警告是因为float变量没有足够的精度来保存int可能带来的任何可能值。这意味着如果您从中投射的整数太大,则强制转换可能会产生错误的结果。例如,像1 000 000 451这样的整数将转换为1.000000E9,使451错误。根据您RAND_MAX的值,这可能会或可能不会在您的具体情况下出现问题。

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

答案 1 :(得分:0)

RAND_MAXrand()本身的返回值都属于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()是一个糟糕的功能,标准也允许它在“随机性”上非常糟糕。如果您需要好的随机数,则不应该依赖标准库,而应使用专用的第三方解决方案(通常包括立即返回浮点的函数)。