【问题标题】:Largest representable negative floating-point number最大可表示负浮点数
【发布时间】:2010-09-03 05:40:55
【问题描述】:

什么是指定最大可表示浮点数的独立于平台的方法?

我们发现一种算法在 PS3 的 SPU 上运行时会出错,但在为 PPU 编译时运行良好:

float x = -FLT_MAX;
/* stuff */
if (x > 0.0f) {
    // If x is unchanged, code is executed on SPU
}

本质上,是否存在明确定义的与 FLT_MAX 等效的负数?

【问题讨论】:

  • 检查here可能有用
  • 为什么不使用负无穷大?
  • 除非 SPU 和 PPU 具有不同的浮点精度,否则应该可以。我怀疑代码中注释掉的 /*stuff*/ 部分存在问题。
  • 目前还不清楚(对我来说,无论如何)你期望代码做什么以及它实际做什么。考虑到浮点数的表示方式,FLT_MAX 的负数不就是 -FLT_MAX(您已经在使用)吗?究竟是什么不工作?
  • @stacker - FLT_MIN != -FLT_MAX

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


【解决方案1】:

你想要std::numeric_limits::lowest(),但它只是c++0x,所以目前还不是很跨平台。

你绝对不想要std::numeric_limits::min() - 这是最小的量级,而不是最远的负数。

如果您想要始终小于所有其他双打的东西,请使用-numeric_limits<double>::infinity()

【讨论】:

  • 赞成,因为我们本质上确实想要一个非常大的负数,并且保证比其他任何东西都小。
【解决方案2】:

在不知道 /* stuff */ 中的内容的情况下,我认为您的问题无法在这里完全解决。

这里有一组很好的关于浮点计算固有问题的幻灯片:http://realtimecollisiondetection.net/pubs/GDC07_Ericson_Physics_Tutorial_Numerical_Robustness.ppt - 那里可能有一些关于问题根源的提示。

IEEE 754 单精度浮点在 SPU 上与在 PPU 上不同 - 在 SPU ISA 文档的第 9 章中有完整的解释,可从http://cell.scei.co.jp/e_download.html 获得,其中还包括单精度的最大幅度浮点数。

【讨论】:

  • 我接受这个作为答案——在阅读了详细说明 SPU 架构的链接文档后,很明显-FLT_MAX 无法正常工作。
  • 顺便说一句,/* stuff */ 中的代码无关紧要,因为 x 仅在某些未满足的条件下被触及; x 在我们检查 x > 0.0f 时没有改变,这就是为什么当它通过时有很多令人头疼的原因!
  • 哦,我错过了 if 块中的注释。很高兴听到你已经解决了:)
猜你喜欢
  • 2015-06-25
  • 2019-02-15
  • 2015-08-10
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多