2014-10-18 7 views
2

x, y는 두 개의 부동 소수점 숫자라고 가정합니다. 그렇다면 사실입니다 :부동 소수점 연산에서 x <= y이고 x-y <= 0입니까?

x<=y <==> x-y<=0 

부동 소수점 연산?

아이디어에 감사드립니다.

[편집] x 및 y가 모두 NaN 인 것으로 가정합니다.

x가 < = y이지만 x-< = 0이 아니거나 x-y가 < = 0이지만 x < = y가 아닌 것은 가능합니까?

+0

@Paul R : NaN 사례가 이제 제외되었으므로 (위 편집 참조) 제 질문은 "정상적인"부동 소수점을 다루는 것에 관한 것입니다. – zell

+0

왜 downvote ?? – zell

+0

중요한 NaN 경우는'x == y'이고 둘 모두 무한대입니다. – tmyklebu

답변

1

[참고 :. 중 하찮게 비 동등성 리드로 나는이 대답 무한과 NaN을 무시하고있어]

당신은 장애인 비정규 번호 (또는 0으로 플러시 동작을) 한 경우 , 빼기가있는 언더 플로를 생성하여 두 표현식간에 동등하지 않게 할 수 있습니다. 예를 들어

이는 x86에서 일부 컴파일러 특정 마법을 필요로

#include <stdio.h> 
#define CSR_FLUSH_TO_ZERO (1 << 15) 

// Note: GCC-specific 
void disable_ftz(void) { 
    unsigned csr = __builtin_ia32_stmxcsr(); 
    csr |= CSR_FLUSH_TO_ZERO; 
    __builtin_ia32_ldmxcsr(csr); 
} 

int main(void) { 
    disable_ftz(); 

    float x = 2.8e-45; 
    float y = 1.4e-45; 

    printf("%e\n", x);   // 2.802597e-45 
    printf("%e\n", y);   // 1.401298e-45 

    printf("%d\n", x <= y);  // 0 
    printf("%d\n", (x-y) <= 0); // 1 
    return 0; 
} 

참고. 그러나 서브 노어가 전혀없는 부동 소수점 구현을 허용 할 수 있으며, 그러한 시스템에서는 동일한 비 등가성을 달성하는 데 필요한 마법이 없습니다.

+2

점진적인 언더 플로우가 발생하면 뺄셈이 언더 플로우하는 것은 분명히 불가능합니다. 그것은 점진적 언더 플로우의 포인트입니다. – tmyklebu

+0

@tmyklebu : 물론, "점진적 언더 플로"(AKA 비정규)에는 한계가 있습니다. 물론, 가장 작은 denormal보다 작은 숫자를 만드는 유일한 방법은'x'와'y'가 그 값에 따라 다르다는 것입니다. 불가능합니다 :) –