我認爲最好是使用isnan()。
如果f不是數字,則isnan()返回true。但它會在例如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();
編輯:這裏的改進例子包括試車手:
#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的麻煩,因爲它們都轉換爲「真」?爲什麼要計算x中的某些內容,並且如果'x> 0.0'和'f == 0.0'而不是'abs(f)<ε「,則返回false,因爲浮點相等(將'float'轉換爲'bool' )是不確定的?我認爲你在那裏有一些不好的代碼。 –
無法發佈「確切」的代碼?函數(x)的「確切」名稱是什麼? – fupsduck
它有什麼不同?由於許可證限制,我無法發佈代碼,這相當類似。 –