Я думаю, что было бы лучше использовать isnan().
isnan() возвращает true, если f не является числом. Но это вернет истину, например. 0,0 ...
#include <cmath>
bool function(float x)
{
float f = doCalculation(x);
return isnan(f) ? false : true;
}
как уже упоминалось, что не поймает случай, когда f равно 0,0 - или очень близко к нему.
Если вам это можно проверить с:
bool near0 = std::abs(f) > std::numeric_limits<float>::epsilon();
EDIT: здесь усовершенствованный пример, включая водителя-испытателя:
#include <cmath>
#include <limits>
#include <iostream>
#include <vector>
// using namespace std;
bool fn(float f) {
if (isnan(f)) return false; // it is not-a-number
return std::abs(f) > std::numeric_limits<float>::epsilon();
}
// testdriver
int main(void) {
std::vector<float> t;
t.push_back(0.0);
t.push_back(0.1);
t.push_back(-0.1);
t.push_back(0.0 + std::numeric_limits<float>::epsilon());
t.push_back(0.0 - std::numeric_limits<float>::epsilon());
t.push_back(0.0 - 2*std::numeric_limits<float>::epsilon());
t.push_back(0.0 + 2*std::numeric_limits<float>::epsilon());
t.push_back(1.0 * std::numeric_limits<float>::epsilon());
t.push_back(-0.1 * std::numeric_limits<float>::epsilon());
t.push_back(0.1 * std::numeric_limits<float>::epsilon());
for (unsigned int i=0; i<t.size(); i++) {
std::cout << "fn(" << t[i] << ") returned " << fn(t[i]) << std::endl;
}
}
TestResults:
fn(0) returned 0
fn(0.1) returned 1
fn(-0.1) returned 1
fn(1.19209e-07) returned 0
fn(-1.19209e-07) returned 0
fn(-2.38419e-07) returned 1
fn(2.38419e-07) returned 1
fn(1.19209e-07) returned 0
fn(-1.19209e-08) returned 0
fn(1.19209e-08) returned 0
Это выглядит как плохой код для меня. Почему вычисление, если 'x <= 0.0'? Зачем перебирать выражение для бесконечности, а не 1.0, поскольку оба они преобразуются в 'true'? Зачем вычислять что-то из x и возвращать false, если 'x> 0.0' и' f == 0.0', а не 'abs (f)
Не удается опубликовать «точный» код? Что такое «точное» имя функции (x)? – fupsduck
Какая разница? Я не могу опубликовать код из-за ограничений лицензии, это достаточно похоже, чтобы быть эквивалентным. –