2010-06-25 3 views

답변

105

C++의 경우 항상 std::abs 만 사용하면 충분합니다. 그것은 모든 숫자 형에 대해 오버로딩됩니다.

C에서 abs은 정수에서만 작동하며 부동 소수점 값은 fabs이어야합니다. C++ (모든 C 라이브러리와 함께)에서 사용할 수 있지만 사용하지 않아도됩니다.

+0

모든 플랫폼의 케이스에 해당합니까? Esp. Windows 및 Mac OS X? 또는 적어도 C++ 표준에 있습니까? – math

+2

@brubelsabs : 예. C++에는 함수 오버로드가 있기 때문에 별도의 fabs 함수가 필요하지 않습니다 (abs는 다양한 유형에 대해 정의 될 수 있으며 C++에 있습니다). 그것은 또한 표준에 의해 보장됩니다. 물론 10 년이 넘은 오래된 컴파일러를 찾아 보시면 지원하지 않는 컴파일러를 찾을 수 있습니다. – stinky472

+1

이것은 C++ 표준에 있습니다. 따라서 Windows와 Mac OS X를 포함한 알맞은 컴파일러를 가진 모든 플랫폼에서 마찬가지입니다. 26.5 절에 C 라이브러리의 int 버전 외에'long ','float','double'과'long double'을 사용합니다. 26.2.7 절은'complex'에 대한 과부하를 정의합니다. –

21

doublefloat 인수에는 여전히 fabs을 사용해도됩니다. 나는 그것이 우연히 std::abs에서 벗겨 내면 동작이 부동 소수점 입력에 대해 동일하게 유지되도록하기 때문에이 방법을 선호합니다.

std::abs 대신 abs을 사용하는 실수로 10 분이 지났습니다. 나는 using namespace std;std::abs을 유추한다고 추측했지만 그렇지 않았으며 대신 C 버전을 사용하고있었습니다.

어쨌든 부동 소수점 입력에 대해서는 abs 대신 fabs을 사용하는 것이 좋습니다. 이것은 의도를 명확하게 문서화하는 방법입니다.

+2

이상 하네. 귀하의 전화가 모호했기 때문에 (따라서 오류가 발생 했음) 맞습니까? – Nick

+0

플로트 용 fabsf를 ​​사용해야합니까? 그래서 나는 그들이 동일하다고 생각하지 않는다. – Nick

+0

안드로이드 NDK g ++에주의하십시오, 그것은 또한 std :: abs() 대신에 abs() 함수를 cedes합니다. Visual Studio에서 C++ 컴파일러 그러나 abs는 항상 std :: abs()를 가리 킵니다. – southerton

7

명시 적으로 부동 소수점 입력에 std::fabs을 권장하는 이유가 하나 더 있습니다.

당신이 <cmath>을 포함하는 것을 잊지 경우

, 당신의 std::abs(my_float_num)std::abs(int) 대신 std::abs(float) 수 있습니다. 알아 차리기가 어렵습니다.

1

"abs"와 "fabs"는 모호한 오버로드 메시지없이 변환 될 수있을 때만 C++ 플로트 유형에 대해 동일합니다.

저는 g ++ (g ++ - 7)을 사용하고 있습니다. 템플릿 사용과 함께 특히 mpreal을 사용할 때 하드 모호한 오버로드 메시지가있는 경우가 있습니다. abs(static_cast<T>(x))이 항상이를 해결하지 못합니다. abs가 모호하면, fabs가 예상대로 작동 할 가능성이 있습니다. sqrt를 위해 나는 그런 간단한 탈출을 발견하지 못했다.

몇 주 후에 저는 C++에서 "현존하지 않는 문제"에 어려움을 겪고 있습니다. 이전 C++ 프로그램을 C++ 14로 업데이트하려고합니다. 동일한 템플릿 매개 변수는 실제 표준 플로트 또는 복합 유형 또는 클래스 유형 일 수 있습니다. 왜, 두 배의 긴 배가 다른 유형보다 약간 더 현명했습니다. 모두 작동하고 있었고 전에 mpreal을 포함 시켰습니다. 그런 다음 기본 부동 소수점 유형을 mpreal로 설정하고 구문 오류가 발생했습니다. 이렇게하면 수천 개의 모호한 오버로드가 발생합니다. abs와 sqrt에 대해 다른 해결책을 강구하고 있습니다. 일부는 과부하가 걸린 도움말 기능이 필요했지만 템플릿 외부에있었습니다. 개별적으로 0.0L 및 1.0L의 천 사용을 Zero 또는 One을 사용하는 정확한 상수 유형 또는 모호성으로 인해 불가능한 type_cast - 자동 변환 정의로 대체해야했습니다.

최대 5 월 내내 암시 적 변환의 기존 항목이 매우 유용하다는 것을 알았습니다. 하지만 훨씬 간단하면 다른 표준 상수 유형에 안전한 명시 적 type_cast를 가진 typesave 상수를 가질 수 있습니다.

관련 문제