isnan()을 사용하는 것이 더 좋을 것이라고 생각합니다.
isnan()은 f가 숫자가 아닌 경우 true를 반환합니다. 그러나 예를 들어 0.0 ...
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' 일 때 왜 계산을합니까? 왜 둘 모두가'true'로 변환 되었기 때문에 1.0이 아닌 무한대의 표현식을 작성해야하는 이유는 무엇입니까? 부동 소수점의 동등성 ('float'에서'bool' 으로의 변환) 때문에'x> 0.0'과'f == 0.0 '이라면 x에서 무언가를 계산하고,'abs (f) <엡실론') 불확실한가요? 거기에 나쁜 코드가 있다고 생각합니다. –
"정확한"코드를 게시 할 수 없습니까? 함수 (x)의 "정확한"이름은 무엇입니까? – fupsduck
무슨 차이가 있습니까? 라이센스 제한으로 인해 코드를 게시 할 수 없으며 이에 상응하는 정도로 유사합니다. –