【问题标题】:c++ function turns a float value into a NaN when returnsc ++函数在返回时将浮点值转换为NaN
【发布时间】:2014-01-21 06:24:47
【问题描述】:

我在使用 nvidia 纹理工具 (nvtt) 库时遇到了一个奇怪的问题,我编译该库以构建我自己的纹理转换器。这是问题所在,我得到了一个总是返回 NaN 的函数。就是这样:

class Filter // a class inside (nvtt library)
{
public:
    ...
    float width() const
    {
        return m_width; // m_width = 3.0 when debug
    }
    ...
private:
    float m_width;
};

当我在返回行放置断点时,我看到 m_width 的值为 3.0,但返回的值始终为 NaN:

width = filter.width(); // width = NaN

我在编译设置(代码生成或类似的事情)方面做错了吗?


已编辑:

我发现了问题但无法解决,因为我不太确定这是 NVTT 库或编译器的问题。我不得不挖掘一些汇编知识来确定这个问题。事实证明,函数退出时 FPU(浮点单元)堆栈已满,因此放入 st0 寄存器的返回值变为 NaN。我不知道为什么堆栈变满了,但这可能是编译器的问题,因为我使用的是最新的 Visual C++ Express 2013,并且在使用 VC2012 编译 NVTT 库时没有这个问题。

【问题讨论】:

  • 我的建议是添加调试打印语句。我猜调试器正在和你玩游戏。
  • 我认为你可能以某种方式破坏了你的堆栈。
  • 这不是冒犯,但你确定你真的处决了width = filter.width();?如果 width 仍未初始化,则可能是 NaN。
  • 你在使用函数指针吗?和演员表?那将是一种相当爆炸性的成分混合物。
  • 您提供的代码片段不足以让人们看到可能出现的问题。您必须在赋值处放置一个断点,然后按 F11 进入函数并继续执行,直到找到值被覆盖的位置。

标签: c++ function return nan


【解决方案1】:

这是 MSVC 2013 中的一个错误。我遇到了一个非常相似的问题,也将 NVTT 库与 MSVC 2013 一起使用。我注意到当我调用 NVTT 库时,有时它会返回 FPU 堆栈上的 2 个额外条目.

我在一个名为 _ftol3_except() 的内部函数中将问题追溯到一些将 float 转换为 int 的代码。显然,如果 floatNaNInf,那么 FPU 堆栈会被推送并且永远不会弹出。

详情:

根据第二个链接,这将在 MSVC 2013 的更新 2 中得到修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2017-08-28
    • 2018-04-30
    • 2012-05-09
    • 2021-12-18
    • 2020-08-14
    相关资源
    最近更新 更多