返回时,c ++函数将浮点值转换为NaN

时间:2014-01-03 14:40:59

标签: c++ function return nan

我对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库时没有遇到此问题。

1 个答案:

答案 0 :(得分:1)

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

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

详情:

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