MSVC ++ 6에서 'ILOGBF'와 같은 IEEE 수학적 기능을 선언하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1726890

  •  19-09-2019
  •  | 
  •  

문제

누군가 MSVC ++ 6에 IEEE 수학적 함수를 포함시키는 방법을 도와 주시고 말씀해 주시겠습니까? 나는 둘 다 시도했지만 여전히 오류를 얻습니다.

오류 C2065 : 'ILOGBF': 선언되지 않은 식별자

오류 C2065 : 'scalbnf': 선언되지 않은 식별자

도움이 되었습니까?

해결책

편집 3 : 희망적으로 이것은 나의 최종 편집이 될 것입니다. 나는이 질문을 제대로 다루지 않았다는 것을 깨닫게되었습니다. 나는 나의 대답을주의 이야기로 남겨두고, 교육적 가치가있을 수 있기 때문입니다. 그러나 나는 왜 내가 upvotes를 가지고 있는지 이해하고, 실제로 나는 그가 훨씬 더 관련성이 있다고 생각하기 때문에 Andy Ross의 대답을 발전시킬 것입니다 (적어도 글을 쓰는 시점에서는 불완전하지만). 내 실수는 내가 ilogbf ()에 대해 찾은 사람의 정의를 약간 피상적으로 받아들이는 것 같습니다. 플로트 로그의 정수 부분을 차지하는 기능입니다. 구현하기가 얼마나 어려울 수 있습니까? 그것은 기능이 실제로 무엇에 관한 것인지, IEEE 부동 소수점 표현, 특히 그 표현의 지수 (Mantissa와 반대) 부분을 나타냅니다. 나는 질문에 대답하기 전에 분명히 깨달았을 것입니다! 나에게 흥미로운 점은 기능이 플로트의 지수 부분을 찾을 수있는 방법입니다. 그러나 그것은 물론 별개의 별도의 토론입니다.

--- 편집 3의 끝,주의 이야기의 시작 ---

약간의 인터넷 검색은 이것들이 유닉스의 일부 맛에 정의되어 있지만 POSIX 또는 ANSI 표준에 있지 않으므로 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;
}

다른 팁

이들은 IEEE754-1985가 아닌 C99 기능입니다. Microsoft는 그들의 시장이 C99 지원에 관심이 없다고 결정한 것으로 보이므로 그들에게 제공하는 것을 귀찮게하지 않았습니다. 이것은 부끄러운 일이지만, 더 많은 사람들 (개발자)이 불평하지 않으면 상황이 바뀔 것이라고 기대할 이유가 없습니다.

새로운 754 표준 IEEE754-2008에는 이러한 기능이 필요하지만 (Clause 5.3.3, "logbformat 작업")이 해당 표준 버전은 몇 년 동안 널리 채택되지 않습니다. 광범위한 채택에 도달하더라도 Microsoft는 C99에 있었던 10 년 동안 이러한 기능을 제공하는 데 적합하지 않은 것을 보지 못했습니다. 왜 IEEE754 표준에 있기 때문에 왜 그들을 제공하는 것을 귀찮게할까요?

편집하다: Scalb 및 Logb는 IEEE754-1985에 정의됩니다. 부록 "권장 기능과 곤경"이지만, 부록은 표준의 일부가 아닙니다.

IEEE 시스템을 알고 있다면 (그리고 요즘에는) 이러한 기능은 필요하지 않습니다. UINT64_T로 더블을 조합하여 비트를 직접 검사하십시오. 아마도 당신은 아마도 처음에 효율성을 위해 이러한 기능을 사용하고 있습니다 (그렇지 않으면 더 많은 자연 운영을 사용하고있을 것입니다. log() 또는 exp()), 코드를 부동 소수점 표현과 일치시키는 데 약간의 노력을 기울이는 것은 아마도 가치가있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top