2009-11-13 2 views

답변

2

편집 3 : 희망 이것은 나의 마지막 편집 일 것이다. 나는 내가이 문제를 적절히 다루지 않았다는 것을 깨닫게되었다. 나는 내 대답을 교훈적 이야기로 남겨두고, 교육적인 가치가있을 수 있기 때문에 그대로 두겠다. 그러나 나는 왜 내가 upvotes가 0이고, Andy Ross의 답변을 upvote하려고 생각한다. 왜냐하면 나는 그의 글이 적어도 더 적절하다고 생각하기 때문이다. (최소한 글쓰기에는 불완전하지만). 내 실수는 ilogbf()에서 발견 한 남자 정의를 표면적으로 조금씩 가져가는 것입니다. 그것은 float 로그의 정수 부분을 취하는 함수입니다. 구현하는 데 얼마나 어려울 수 있습니까? 함수가 실제로 무엇인지는 IEEE 부동 소수점 표현, 특히 그 표현의 지수 (가수와 반대) 부분입니다. 나는 확실히 그 질문에 대답하려고 시도하기 전에 깨달았어야한다! 흥미로운 점은 함수가 float의 지수 부분을 어떻게 찾을 수 있는지에 관한 것입니다. C의 근본적인 규칙은 float가 함수 호출의 일부로 두 배로 승격된다는 것입니다. 그러나 그것은 물론 전체적으로 분리 된 토론입니다.

--- 약간의 인터넷 검색이 유닉스의 일부 맛에 정의 된,하지만 어쩌면 어떤하여 Posix 또는 ANSI 표준에없는 등 제공되지 않습니다 제안

편집 3,주의 이야기의 시작의 끝 --- MSVC 라이브러리. 함수가 라이브러리에 없으면 math.h에 선언되지 않습니다. 컴파일러가 이러한 외부 기호에 대한 선언을 볼 수 없다면 분명히 행복하지 않을 것이고 목록에있는 것과 같은 오류가 발생할 것입니다.

확실한 해결 방법은 인 수학 함수를 사용하여 이러한 함수의 고유 한 버전을 만드는 것입니다. 예 :

#include <math.h> 

int ilogbf(float f) 
{ 
    double d1 = (double)f; 
    double d2 = log(d1); 
    int ret = (int)d2; 
    return ret; 
} 

편집 : 이것은 적절하지 않습니다. 분명히이 함수는 자연 로그보다는 기본 2에 로그를 사용해야하므로 반환 된 값은 실제로 이진 지수가됩니다. 또한 음수에 대해서도 작동하도록 매개 변수의 절대 값을 취해야합니다. 나는 당신이 코멘트에서 나에게 묻는다면 개선 된 버전을 만들 것이다. 그렇지 않으면 독자를위한 운동으로 남겨 둬야한다 .-))

ANSI C의 대답은 본질적이지 않다. 이 기능이 필요하며 MSVC에이 기능이 포함되어 있지 않은 것이 분명합니다.

편집 2 좋아요. 나는 약화되어 물어 보지 않고 개선 된 버전을 제공했습니다. 여기있어;

#include <math.h> 

int ilogbf(float f) 
{ 
    double d1 = (double)f; 
    if(d1 < 0) 
     d1 = -d1; 
    double d2 = log(d1)/log(2); // log2(x) = ln(x)/ln(2) 
    int ret = (int)d2; 
    return ret; 
} 
+0

흥미로운 편집 내러티브 =) –

1

당신은 IEEE 시스템에있어 알고 있다면 (요즘, 당신이)는, 이러한 기능이 필요하지 않습니다 : 그냥 uint64_t로 두 번 unioning 직접 비트를 검사합니다. 아마도 처음에는 효율성을 위해 이러한 함수를 사용하고 있습니다 (그렇지 않으면 log() 또는 exp()과 같은 자연스러운 연산을 사용하게 될 것입니다). 따라서 코드를 부동 소수점 표현과 일치시키는 데 약간의 노력을 기울이는 것이 좋습니다.

2

이들은 IEEE754-1985가 아닌 C99 기능입니다.마이크로 소프트는 그들의 시장이 C99 지원에 신경 쓰지 않기로 결정한 것으로 보인다. 이것은 수치 스럽지만 더 많은 개발자 (개발자)가 불평하지 않는 한 상황이 바뀔 것으로 예상 할 이유가 없습니다.

새로운 754 표준 인 IEEE754-2008은 이러한 기능 (5.3.3 절. "logBFormat 작업")이 필요하지만이 표준 버전은 몇 년 동안 널리 채택되지 않습니다. 마이크로 소프트는 C99에서 10 년 동안 이러한 기능을 제공하지 못했기 때문에 IEEE754 표준에 부합하는 이유는 무엇입니까?

편집 : scalb 및 logb에이 IEEE754-1985 부록 "권장 기능 및 술어"에 정의되어 있지만, 부록 말했다 참고가 명시 적으로는 "하지의 일부"표준 말했다.

+0

도움을 주셔서 감사합니다 – make

+0

내가 틀린 것으로 인정한다는 것을 분명히 표시 했음에도 불구하고 내 대답을 허용 된 것으로 표시 한 이유가 있습니다. 나는 이것이 가장 최근의 대답이 최고라고 생각한다. 사실 나는 지금 그것을 2로 upvote하려고한다. 적어도 내 대답에 대한 동의를 취소하십시오. –