플로트를 비교할 때 차이의 임계 값을 무엇이라고합니까?


10

Java에서 float를 비교하고 있으며 가장 간단한 공식은 다음과 같습니다.

Math.abs(a - b) < THRESHOLD

차이의 임계 값으로 변수의 이름을 지정할 때 이름을 delta 또는 epsilon으로 지정해야 합니까? 특히, 부동 소수점 숫자가 나타낼 수있는 가장 작은 값에 대한 올바른 용어는 무엇입니까?

프로그래밍 언어라는 용어가 구체적입니까, 아니면 언어 전체에 보편적입니까?


1
다른 용어 : "정밀도", "해상도". 나는 기술적으로 들리지 않기 때문에 이것을 정확하게 좋아합니다.)
stakx

1
꺼짐 - 주제 : 부동 소수점 가이드는 권고 에 대해 거의 동등 비교의이 유형을 사용하여.
stakx

1
@stakx-제안한 용어가 올바르지 않으며 OP가 요구하는 것과 다른 의미를 갖습니다. 문제는 예, 자세히 설명되어 있지만 되어 외부 참조에 답할 수를 기반으로하며 부동 소수점 값을 처리 할 때 프로그래밍 관련을 가지고있다. 건설적이고 주제입니다.

1
@ GlenH7 : 나는 그 질문이 좋은 것이 아니거나 대답 할 수 없다고 말한 적이 없습니다. 사실, 나는 그것을지지 한 사람이었습니다. 그리고 당신이 내가 제안한 (정확히 덜 정확한) 용어가 잘못되었다고 주장하고 있기 때문에, 왜 그런지 배우는 데 관심이 있습니다 .
stakx

@stakx-종료하기로 투표 한 것에 대해 사과드립니다. 나는 현재 그 질문에 대한 4 가지의 찬성 투표에 더 반응하고 있었다.

답변:


18

수학 및 공학 분야의 Epsilon

일반적으로 수학 및 공학에서 :

  • 델타 는 일반적으로 어느 정도의 차이를 나타내는 데 사용됩니다.
  • 엡실론 은 일반적으로 무시할만한 수량을 나타내는 데 사용됩니다.

엡실론은 귀하의 경우에 더 적절 해 보입니다.


컴퓨터 과학의 Epsilon

특히 컴퓨터 과학 용어 엡실론도 지칭 기계 espilon 차이 측정 1.0f및보다 확실히 크다 작은 플로트 1.0f. 후자의 숫자는 1.00000011920928955078125fJava의 부동 소수점 수이며 다음 을 사용하여 계산할 수 있습니다.

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

머신 엡실론의 정의는 위에서 설명한 엡실론의 일반적인 사용과 일치합니다.


수레 비교

그러나 "근접성"에 대한 플로트를 비교하기 전에 그 규모에 대한 아이디어가 필요합니다. 두 개의 매우 크고 아마도 다른 플로트는 같을 수 있습니다.

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

역으로, 기계 엡실론 "단지"에 의해 다른 두 개의 작은 플로트 사이에 가능한 많은 플로트 값 (및 수십 배)이있을 수 있습니다. 아래 예에서 small와 사이에 10,000,000 개의 부동 소수점 값이 f있지만 그 차이는 여전히 머신 엡실론보다 훨씬 낮습니다.

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

GlenH7의 답변 과 관련된 기사는 플로트 비교를 추가로 조사하고 이러한 문제를 극복하기위한 몇 가지 솔루션을 제안합니다.


2
-1 : 과학 전산 소프트웨어에서 Epsilon은 Machine epsilon 또는 Relative epsilon (동일한 기사 참조)을 나타냅니다. 일반적으로이 반올림 오차가 있기 때문에, 대략 같음을 수락에서 사용되는 동일한 양 아닌 배수 시스템 epsilons 또는 상대의 epsilons는, 그보다 큰 크기의 통상 몇 오더.
rwong

1
@rwong 그것은 epsilon 이라는 용어의 전문 분야 이며 다른 것들도 많이 있습니다. 일반적으로 엔지니어링에서 엡실론은 소량 또는 오류를 나타내며 머신 엡실론은 그 아이디어와 호환됩니다.
assylias

@assylias는 표준 정의가 의미있는 상황에서 표준 정의를 가진 이름을 사용하지만 표준 정의에 해당하지 않는 문제는 문제를 나타냅니다.
AProgrammer

@AProgrammer 나는 epsilon의 일반적인 정의가 컴퓨팅에 적용되지 않는다는 것에 동의하지 않습니다.
assylias

1
@assylias : 설명해 주셔서 감사합니다. 내 -1을 제거했습니다.
rwong

16

수학에서 델타는 값과의 일부 차이를 나타내는 데 사용되고 엡실론은 임의의 오류 값을 나타내는 데 사용됩니다. 이 경우, 엡실론은 일반적인 이름입니다.


8

질문에 직접 대답하기 위해이라는 용어를 사용하려고합니다 epsilon. 보다 정확하게는 machine epsilon일반적인 사용법이지만 "machine"이 떨어지고 그냥 사용합니다 epsilon.

내 로컬 사본을 float.h보면 다음과 같습니다.

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

그리고 관련된 의견은 엡실론이 당신이 말하는 용어임을 분명히합니다.

그러나 다른 외부 참조를 사용 epsilon하여 올바른 용어인지 확인할 수도 있습니다. 여기 , 여기 , 여기 및 마지막으로이 SO 쿼리 태그 조합을 참조 하십시오 . 인용 할 IEEE 754 표준에 대한 직접적인 참조를 찾을 수 없었습니다.


당신은 묻지 않았지만 질문을 명확히하기 위해 제공 한 예와 매우 관련이있는이 참조를 발견했습니다.

Valve의 Bruce Dawson이 작성한 블로그 기사 에서 플로팅 포인트 값 을 비교하여 제안한 비교를 사용하고 싶지 않은 이유에 대한 통찰력을 얻으십시오.

이 기사에는 약간의 정보가 들어 있지만 여기에서 가장 관련있는 스 니펫입니다.

플로트를 평등에 대해 비교하는 것이 나쁜 생각이라면 차이가 일부 오류 범위 또는 엡실론 값 내에 있는지 확인하는 방법은 다음과 같습니다.

bool isEqual = fabs(f1 – f2) <= epsilon;

이 계산을 통해 우리는 두 플로트가 동일하다고 생각하기에 충분히 가깝다는 개념을 표현할 수 있습니다. 그러나 엡실론에 어떤 가치를 사용해야합니까?
위의 실험을 감안할 때 우리는 1.19e-7f 정도의 합계에서 오류를 사용하려는 유혹을받을 수 있습니다. 실제로 float.h에는 정확한 값을 가진 정의가 있으며 FLT_EPSILON이라고합니다.
분명히 그렇습니다. 헤더 파일 신이 말했고 FLT_EPSILON은 하나의 진정한 엡실론입니다!
그것이 쓰레기라는 것을 제외하고. 1.0과 2.0 사이의 숫자의 경우 FLT_EPSILON은 인접한 float 간의 차이를 나타냅니다. 1.0보다 작은 숫자의 경우 FLT_EPSILON의 엡실론이 너무 빨리 커지고, 작은 숫자로 FLT_EPSILON이 비교하는 숫자보다 클 수 있습니다!

Dawson은 플로트를 비교하고 이와 같은 매우 작은 값을 처리 할 때 관련된 복잡성에 대해 몇 가지 다른 고려 사항을 검토하므로 나머지 게시물을 읽는 것이 좋습니다.


답변의 첫 부분을 분명히 밝히고 싶을 수 있습니다. Bruce의 기사는 왜 공차 비교를 위해 상수 엡실론 (예 : 헤더 파일에 정의 된 것)을 사용해서는 안되는지 설명합니다. 또한 많은 경우에 수백만 ULP의 오류는 걱정할 것이 없습니다. 대부분의 응용 프로그램에서 우리는 배정 밀도가 이미 제공하기 때문에 가장 중요하지 않은 숫자의 오류보다 더 큰 유효 숫자에 더 관심이 있기 때문입니다. 우리가 걱정하는 것보다 더 많은 자릿수.
rwong

@ rwong-내가 읽을 때 문제는 상수 이름에 사용할 올바른 용어를 식별하는 것이 었습니다. 그래서 나는 엡실론을 가공하기 위해 float.h 참조를 몇 가지 다른 것들과 함께 제공했습니다. Dawson의 기사는 IEEE 754 참조를 검색하는 동안 찾은 것으로 OP의 simplest formula비교 와 관련이 있다고 생각했습니다 . 많은 사람들이 그 접근법을 첫 번째 시도로 사용했으며, Dawson의 기사를 포함 시켰습니다. 왜냐하면 비교가 얼마나 까다로운 지에 대한 미묘한 차이가 있기 때문입니다. 그래서 나는 질문에 직접 대답하고 왜 그렇게 사용하지 않는지 지적하려고 노력했습니다.

5

이것은 오류 함수입니다. 절대 오차는 일반적으로 일부 수량 x에 대해 ε (엡실론) 또는 Δ x 라고합니다 .

ε = | 예상-실제 |

Δ x = | x 0x  |

상대 오차는 때때로 η (eta) 라고합니다 .

η = | 1-실제 / 예상 |

프로그래밍 목적 absoluteErrorrelativeError(또는 일부 약어) 더 설명 적입니다. 오류가 특정 값보다 작다고 주장하려면 해당 값을 간단히 임계 값 또는 공차 라고합니다 .

보다:


3

"공차"라고 부릅니다.

어쩌면 그것은 수학적으로 올바른 용어는 아니지만, "델타"나 "엡실론"이 사용하기에 좋은 변수 이름이 아니라는 것을 나에게 암시합니다.

내 경험상 실제로 코드를 읽는 사람들에게 적합한 식별자 이름을 사용하는 것이 좋습니다. 독자가 그것이 무엇을 의미하는지 이해하기 위해 위키 백과에서 찾아야한다는 것을 의미한다면 완벽하게 올바른 이름은 무엇입니까?


+1. 항상 사람들이 동료에게 이러한 이름 지정 질문에 대해 질문하고 여기에 게시하기를 바랍니다.
MarkJ

6
-1, 컨벤션을 피하는 것보다 배우는 것이 좋습니다.
djechlin

이것이 내가이 질문을 게시 한 것과 동일한 이유이기 때문에 +1입니다.
NobleUplift 2009 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.