2014-05-23 5 views
0

Epsilon의 임의의 값을 선택하기 만하면 부동 소수점을 비교하는 것에 대한 PHP의 많은 질문을 본 다음 if(abs($a-$b) < 0.000001)을 수행하십시오. ,왜 PHP는 부동 소수점 비교를 위해 엡실론 상수를 제공하지 않습니까?

$macheps = (float) 1.0; 
do { 
    $macheps /= (float) 2.0; 
} while((float) (1.0 + ($macheps/2.0)) != 1.0); 
printf("Epsilon: %0.25f\n", $macheps); 

C++는 std::numeric_limits<double>::epsilon() 있습니다

문제는 엡실론은 일반적으로 사람들이 [내 컴퓨터에 2.22e-16]을 선택하는 경향이 값보다 훨씬 작 실제로 계산하는 것이 매우 간단하다는 것이다 파이썬은 sys.float_info.epsilon을 가지고 있습니다. 그렇다면 PHP는 왜 그것을 공중에 버립니 까?

+2

아마도 다른 사람들은 정밀도에 대해 서로 다른 요구 사항을 갖기 때문에 –

+0

"대답은 단순히 엡실론의 임의의 값을 선택하는 것입니다." 이 대답은 간단하고 호소하며 죽은 잘못입니다. 그러지 마. –

+1

'PHP_FLOAT_EPSILON'이 PHP 7.2에 추가되었습니다 : 가장 작은 표현 가능한 양수 x이므로 x + 1.0! = 1.0_ –

답변

2

abs($a-$b) < 0.000001 수식에 0.000001 대신에 std::numeric_limits<double>::epsilon()을 사용하지 마십시오. 예를 들어, 대부분의 C++ 컴파일 플랫폼에서는 std::numeric_limits<double>::epsilon()double의 정의 인 1을 나타내므로 fabs(x - 2.5) < std::numeric_limits<double>::epsilon()x == 2.5과 같습니다.

일부 프로그래머는 부동 소수점 수를 어떤 값까지 비교해야 할 수도 있지만 그 값은 1에 가까운 부동 소수점 형식 정의와 관련이 거의 없습니다. 따라서이 상수를 제공해야하는 것은 아닙니다. 언어로. 그 대신 값은 요구 사항 ("필요한만큼 작음") 또는 추론 ("실제 결과에서 부동 소수점 결과는 0.003이 될 수 있으므로 실제 결과가 2.5 일 수있는 경우 fabs(x - 2.5) < 0.003이 false가되지 않습니다.") .