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 的代码。显然,如果 floatNaNInf,那么 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在c ++中查找函数是不是在一定时间内返回某个值?

将浮点数转换为字符串

Namber函数

js类型转换-字符串转整型浮点型方法强制类型转换等

检查 NaN 数据值 (C/C++/Python 实现)

C语言类型转换