gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:11:28 25 4
gpt4 key购买 nike

我在使用 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 库时没有这个问题。

最佳答案

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

我将问题追溯到一些代码,这些代码在名为 _ftol3_except() 的内部函数中将 float 转换为 int。显然,如果 floatNaNInf,则 FPU 堆栈会得到一些东西,但不会弹出。

详情:

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

关于c++函数在返回时将浮点值转换为NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com