c ++函数在返回时将浮点值转换为NaN
Posted
技术标签:
【中文标题】c ++函数在返回时将浮点值转换为NaN【英文标题】:c++ function turns a float value into a NaN when returns 【发布时间】: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 进入函数并继续执行,直到找到值被覆盖的位置。
【参考方案1】:
这是 MSVC 2013 中的一个错误。我遇到了一个非常相似的问题,也将 NVTT 库与 MSVC 2013 一起使用。我注意到当我调用 NVTT 库时,有时它会返回 FPU 堆栈上的 2 个额外条目.
我在一个名为 _ftol3_except()
的内部函数中将问题追溯到一些将 float
转换为 int
的代码。显然,如果 float
是 NaN
或 Inf
,那么 FPU 堆栈会被推送并且永远不会弹出。
详情:
https://bugzilla.mozilla.org/show_bug.cgi?id=929834 http://connect.microsoft.com/VisualStudio/feedback/details/806362/vc12-pollutes-the-floating-point-stack-when-casting-infinity-nan-to-unsigned-long根据第二个链接,这将在 MSVC 2013 的更新 2 中得到修复。
【讨论】:
以上是关于c ++函数在返回时将浮点值转换为NaN的主要内容,如果未能解决你的问题,请参考以下文章