【发布时间】:2012-09-02 08:40:18
【问题描述】:
假设你有一个std::complex<double> array[N];
如何在 for 循环中将所有 -inf 和 inf 值设置为 0?
std::isinf 对我不起作用,编译器早于 C++11
【问题讨论】:
-
@robert 谢谢,我会在那里尝试解决方案,但我不确定它们是否适用于 std::complex ,也许如果我只使用数组的实部
标签: c++
假设你有一个std::complex<double> array[N];
如何在 for 循环中将所有 -inf 和 inf 值设置为 0?
std::isinf 对我不起作用,编译器早于 C++11
【问题讨论】:
标签: c++
试试这个:std::numeric_limits<double>::infinity() 将提供一个值,告诉您一个数字是否为无穷大。
这里是vector 的double 值的示例代码;您可以将repl_inf 更改为使用complex<double>。
#include <iostream>
#include <algorithm>
#include <vector>
#include <limits>
using namespace std;
int repl_inf (double v) { return (v== std::numeric_limits<double>::infinity() || -v== std::numeric_limits<double>::infinity()) ? 0.0 : v; }
int main() {
vector<double> v;
v.push_back(1);
v.push_back(1.0/0.0);
v.push_back(2);
v.push_back(-1.0/0.0);
transform (v.begin(), v.end(), v.begin(), repl_inf);
for (int i = 0 ; i != v.size() ; i++) {
cout << v[i] << endl;
}
return 0;
}
在ideone上:link。
对于complex<double>:
bool isInf(double v) {
return v== std::numeric_limits<double>::infinity()
|| -v== std::numeric_limits<double>::infinity();
}
bool isInf(complex<double> c) {
return isInf(c.real) || isInf(c.imag);
}
【讨论】:
for ( int i = 0; i< N; i++){ if (real(phi[i])== std::numeric_limits<double>::infinity() || -real(phi[i])== std::numeric_limits<double>::infinity()){ phi[i] = 0; },其中 phi 是 std::complexcomplex 的各个组件的无穷大。我编辑了答案以显示如何完成。
std::replace( array, array + N, std::complex( std::numeric_limits<double>::infinity(), 0.0), std::complex(0.0) );
std::replace( array, array + N, std::complex( -std::numeric_limits<double>::infinity(), 0.0), std::complex(0.0) );
或
bool isinf( std::complex<double> d )
{
return std::abs( d.real() ) == std::numeric_limits<double>::infinity()
}
std::replace_if( array, array + N, isinf, 0.0 );
【讨论】:
std::complex<double> 不是 vector<double> 或只是 double
std::complex( inf, 0 )吗?
std::complex(inf, -inf) 这样的值吗? “想象的负无穷大”确实有意义,但遇到这种情况非常不寻常。