【问题标题】:Is generate_canonical output consistent across platforms?generate_canonical 输出是否跨平台一致?
【发布时间】:2017-03-08 17:10:21
【问题描述】:

C++ 标准在 [rand.util.canonical] 下非常详细地说明了模板函数 std::generate_canonical 的工作原理(尽管它只提供伪代码,而不是 C++ 代码)。

规范作者的意图是,在 RealType 上的数学工作相同的不同平台上,对于在两个平台上给出相同输出的确定性 URNGstd::generate_canonical 给出相同的输出好吗?

这与 Is 1.0 a valid output from std::generate_canonical? 之类的类似问题有关——散文指出 1.0 被排除在外,但他们在伪代码中给出的算法有时会将其作为输出包含在 RealTypeURNG 的某些组合中。

这与讨论的随机数分布函数形成对比,例如C++11 random number distributions are not consistent across platforms -- what alternatives are there?;该标准确实“不”指定如何生成正态分布,仅指定其属性

我还没有找到任何讨论这个问题的 DR,而且标准的措辞在我可以轻松访问的 C++11、C++14 和 C++17 草案标准中表面上是相同的。

【问题讨论】:

    标签: c++ random floating-point cross-platform


    【解决方案1】:

    连题中遇到的难点指向一致性的基本问题:取整模式。标准中generate_canonical 的数学定义的明确意图是多次调用URNG,每次都产生一个不重叠的熵块来填充结果;这将在各个平台上完全一致。问题是,没有说明如何处理 LSB 以下的额外位。根据舍入模式和求和顺序,这些可以向上舍入,溢出到下一个块(这是允许 1.0 结果的原因)。

    现在,准确的措辞是“实例化的结果......按照下面的规定尽可能均匀地分布”。如果舍入模式是舍入到最近的,则产生 1.0 的实现不是尽可能统一(因为 1-eps 不太可能低于 1-2*eps)。但它仍然是“如下所述”。因此,取决于您如何解析该句子,generate_canonical 要么是完全指定且一致的,要么已将一些额外的未讨论位委托给实现。

    无论如何,某些实现产生 1.0 的事实清楚地表明当前行为不是跨平台一致的。如果您愿意,似乎最直接的方法是将您的 URNG 包装在 independent_bits_engine 中以产生 bits 位的某些因子,因此永远不会有任何东西可以舍入。

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 2014-01-24
      • 2014-10-29
      • 1970-01-01
      • 2015-04-07
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多