1

あなたが持っているとしましょうstd::complex<double> array[N];

for ループですべて-infの値を 0 に設定するにはどうすればよいですか?inf

std::isinf コンパイラが C++11 よりも古い

4

2 に答える 2

1

これを試してください:std::numeric_limits<double>::infinity()は、数値が無限大かどうかを示す値を提供します。

vectorのコード例を次に示します。を代わりに使用するようにdouble変更できます。repl_infcomplex<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);
}
于 2012-09-09T00:10:26.863 に答える
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 );
于 2012-09-09T00:15:19.370 に答える