I가하기의 C 식 (변수 32 비트 수레)부동 소수점 제로 C 구현에서 (IEEE 754 불변?)
float result = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
가 가정 x0==x1
및 y0==y1
(및 ==
와 I 이진 의미 그 표현의 신원), 표현식이 반드시 0으로 평가된다는 사실에 의존 할 수 있습니까 (부동 소수점의 모든 비트는 0으로 설정 됨)? 즉, 다음 불변식이 항상 있다고 가정 할 수 있습니까?
memcmp(&a, &b, sizeof(float) == 0 => memcmp(a-b, (uint32_t)0, sizeof(float)) == 0
0*a == 0.0
모든 값이 유한 수 (아무 INFINITY 또는 NaN이) 있다고 가정하는 것이 안전합니다.
편집 : 답변에서 지적한대로 0을 곱하면 부호있는 0이 생성 될 수 있습니다. memcmp는 더 나은 질문을 설명하기 위해 호출로 대체 유형 캐스트 : 나는 아직도 식의 결과가 FP-비교 규칙을 사용하여 0.0으로 동일 할 것이라는 사실, 즉 :
(result == 0.0)
편집 1에 의존 할 수 있습니다.
P. 어떤 차이가 생길 경우를 대비하여 필자는 코드를 준수하는 C11 컴파일러로만 제한하려고합니다. 나는 또한 STDC_IEC_559 지원에 의존 할 의향이 있다면 내 도움이 될 것입니다.
'y2 - y0'과'x2 - x0'도 유한하다고 가정 할 수 있습니까? –
@OliverCharlesworth : 예. 그렇지 않은 경우 결과가 정의되지 않은 상태로 확인됩니다. – MrMobster
어떤 유형이'a'와'b'입니까? uint32_t가 아닌 경우 코드에서 정의되지 않은 동작을 호출합니다 (유효 유형 규칙 위반). 그래서 표준에 의해 허용되는 것이 있습니다.'ZERO'와 동일합니다. – Olaf