【问题标题】:Rand() Conversion WarningRand() 转换警告
【发布时间】:2015-11-01 22:42:41
【问题描述】:

我有:

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

这也给出了同样的警告:

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

还有警告:

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

任何可能的修复?

【问题讨论】:

  • 使用doublefloat 太不精确 - 可能会丢失来自 int 的宝贵信息。你为什么要投到float 而不是double 呢?或者也许使用1.0*rand()/RAND_MAX * BOUND;
  • 因为起初它是双倍的,但试图修复它.. 做了一些愚蠢的事情
  • 我尝试编译这个。我将 BOUND 定义为 100。没有收到任何警告。这是在 OSX 上的 Xcode 7.1 中编译的。你是在什么环境下编译的?

标签: c random type-conversion c99


【解决方案1】:

RAND_MAXrand() 本身的返回值都是int 类型。

32 位 int 的最大值 (INT_MAX) 最多为十位。

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

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

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

总而言之,rand() 是一个糟糕的函数,标准也允许它在“随机性”方面相当糟糕。如果您需要个随机数,则不应依赖标准库,而应使用专用的第三方解决方案(通常包括立即返回浮点数的函数)。

【讨论】:

    【解决方案2】:

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

    改用double 会更安全,因为您不应该遇到这个问题。

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 2011-07-05
      • 2014-02-16
      • 2014-01-29
      • 2015-08-05
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多