在c ++中将-inf和inf值过滤掉为0

时间:2012-09-09 00:00:01

标签: c++

假设您有std::complex<double> array[N];

如何在for循环中将所有-infinf值设置为0?

std::isinf对我来说不适用于编译器早于C ++ 11

2 个答案:

答案 0 :(得分:1)

请尝试以下操作: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);
}

答案 1 :(得分:1)

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 );