gpt4 book ai didi

c++ - Eigen:log() 的计算限制是什么? (Windows 与 Linux)

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

我的 Eigen 代码有一个奇怪的问题。它在 Linux(64 位)和 Mac OSX(64 位)上运行良好,但在 Windows(32 位)上运行失败,并显示 1.#INF 值。

我将问题追溯到这个函数,我在其中实现了 Box-Muller-transform:

Eigen::MatrixXd box_muller ( const Eigen::VectorXd vRand )
{
unsigned long n = vRand.rows();
unsigned long m = n/2;

Eigen::ArrayXd rand1 = vRand.head ( m );
Eigen::ArrayXd rand2 = vRand.tail ( m );

/* Implemented according to
* http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform
*/

for ( unsigned long i=0; i<rand1.cols(); i++ )
{
if ( rand1 ( i ) < 1e-8 )
{
rand1 ( i ) = 1e-8;
}
}

rand1 = (-2 * rand1.log()).sqrt(); // something must be wrong here

std::cout << rand1.mean() << std::endl; // prints 1.#INF

rand2 = rand2*2*M_PI;

Eigen::MatrixXd result ( 2*m, 1 );
Eigen::MatrixXd res1 = ( rand1 *rand2.cos() ).matrix();
Eigen::MatrixXd res2 = ( rand1 *rand2.sin() ).matrix();
result << res1, res2;

return result;
}

这段代码失败了,但仅在 Windows 上且仅适用于大型输入 vector vRand。它失败是因为在 rand1 中有生成 1.#INF-1.#INF1.#IND 的意外值1.#QNAN 后续计算中的值。当我将 vRand 中的元素数量设置为较小的数字时,例如 10000,它工作正常。但是当数字很大时(例如 100000)它会失败。

我尝试了所有我能想到的方法,但现在我没有想法了。我可以尝试如何消除这个问题?

更多信息:

  • 我们正在使用 MS Visual Studio 12.0 构建它。它在构建服务器上运行,因此我无法轻易找到确切的版本。
  • 据我所知,我们正在使用 C++0x。

最佳答案

我建议替换这个循环:

for ( unsigned long i=0; i<rand1.cols(); i++ )
{
if ( rand1 ( i ) < 1e-8 )
{
rand1 ( i ) = 1e-8;
}
}

与:

rand1 = rand1.max(1e-8); // limit min value to 1e-8
rand1 = rand1.min(1.0); // limit max value to 1.0

这将保证 rand1.log() 的值将是 <= 0和随后的 sqrt()不应该然后失败。如果这解决了问题,那么您可能需要回过头来确定超出范围的输入值的来源。

关于c++ - Eigen:log() 的计算限制是什么? (Windows 与 Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26013205/

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