我对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库时没有遇到此问题。
答案 0 :(得分:1)
这是MSVC 2013中的一个错误。我遇到了一个非常类似的问题,也使用了带有MSVC 2013的NVTT库。我注意到当我调用NVTT库时,有时会返回FPU堆栈上的2个额外条目
我将问题追溯到一些代码,这些代码在名为float
的内部函数中将int
转换为_ftol3_except()
。显然,如果float
是NaN
或Inf
,则FPU堆栈会被推送并且永远不会弹出。
详情:
根据第二个链接,这将在MSVC 2013的更新2中修复。