4

(32 비트 이진 문자열에서 변환 된) 32 비트 부동 소수점 숫자를 사용하고 이전에 표현할 수있는 float를 32 비트 이진수로 반환하는 함수를 작성하려고합니다. 지금까지 바이너리에서 플로트 다운으로 변환했지만, 다음 표현 가능한 IEEE 754 값을 찾는 방법을 이해하는 데 어려움을 겪고 있습니다. 가능한 가장 작은 표현 가능한 값 (000 0000 0000 0000 0000 0001)을 뺄 수는 없습니까? 또한 가장 가까운 표현 가능한 바이너리 값을 찾기 전에 IEEE 754에서 Float로 변환 할 때의 이점은 무엇입니까?C로 다음 IEEE 754 표현 가능 번호 찾기 (-INF 방향)?

지금까지 부동 소수점 수를 단순 정밀도 32 비트 이진수로 변환하는 함수 만있었습니다. 내 코드를 포함 시키겠다.하지만 학교를위한 것이므로 온라인으로 올려 놓거나 명시적인 수정과 조언을받는 것이 좋을지 모른다.

+0

1) 게시 내용. 2) 힌트 : float -> binary, binary ++ 또는 -, binary -> float. – chux

+0

32 비트 이진 비트 문자열에서 32 비트 "float"로의이 "변환"이란 무엇입니까? –

+0

내 프로그램은 int 배열 [32] 형태로 바이너리를 가져온 다음 부호, 지수 및 가수를 부동 소수점 숫자로 변환합니다. – user3614396

답변

4

Q : 가능한 가장 작은 표현 가능한 값을 뺄 수 없습니까?
A : 아니오. 부동 소수점 숫자는 대수적으로, 선형으로 분포하지 않습니다. 0.000001과 같은 고정 값을 빼면 큰 float에는 아무런 영향을주지 않으며 작은 float 값에 지나치게 큰 영향을 미칩니다.

Q : 가장 가까운 표현 가능한 이진 값을 찾기 전에 IEEE 754에서 Float로 변환 할 때의 이점은 무엇입니까?
A : "IEEE 754"에서 "Float"는 일반적으로 같은 유형이므로 변환이 발생하지 않습니다. 둘 다 32 비트 숫자 표현입니다.

다음은 float이 IEEE 754 binary32에 따라 다릅니다. 또한 일치시킬 int32_tfloat의 엔디안에 따라 다릅니다. 입력이 -INF 일 때 NaN을 반환합니다.

float nextdown(float x) { 
    union { 
    float x; 
    int32_t i; 
    } u; 
    u.x = x; 
    if (u.i > 0) { 
    u.i--; 
    } 
    else if (u.i < 0) { 
    u.i++; 
    } 
    else { 
    u.i = 0x80000001; 
    } 
    return u.x; 
} 

위의 코드는 NaN을 제대로 처리하지 못합니다. 간단한 추가 시험 :

float nextdown(float x) { 
    // catch NaN 
    if (x != x) return x; 

    union { 
    float x; 
    int32_t i; 
    } u; 
    ... 

주 : 영업 이익의 원하는 기능이 코드를 테스트하는 데 사용 된 거의 <math.h>nextafterf(x,-1.0f/0.0f)과 완전히 동일합니다. NaN 및 -INF의 차이점.

+0

math.h에서 nextafterf() 함수를 살펴 봤지만 효과적으로 그 코드를 내 코드에 적용하기에는 충분치 못합니다. – user3614396

+2

@ user3614396'nextafterf()'는 2 개의 인자'x'와'y'를 취합니다. 'y'의 방향으로'x'에 가장 근접한 표현 가능한'float'을 반환합니다. 따라서 nextafterf (1.0f, 2.0f)는 1.0f보다 큰 숫자를 반환합니다. 'nextafterf (1.0f, 0.0f)'는 1.0f보다 작은 숫자를 반환합니다. 'nextafterf (1.0f, 1.0f)'는'1.0f'를 반환합니다. – chux

관련 문제