나는을 사용할 때 abs
와 fabs
다르게 행동 한다고 가정합니다 math.h
. 하지만 cmath
and std::abs
를 사용할 때는 std::fabs
또는 을 사용해야 fabs
합니까? 아니면 이것이 정의되지 않았습니까?
답변
C ++에서는 항상 사용하기에 충분합니다 std::abs
. 모든 숫자 유형에 대해 오버로드됩니다.
C에서는 abs
정수에서만 작동 fabs
하며 부동 소수점 값 이 필요 합니다. C ++ (모든 C 라이브러리와 함께)에서 사용할 수 있지만 사용할 필요가 없습니다.
답변
fabs
for double
and float
arguments 를 사용 하는 것은 여전히 괜찮습니다 . 그것을 보장하기 때문에 나는이 선호하는 내가 실수로 제거하면 std::
오프를 abs
동작 점 입력을 부동 동일하게 유지.
abs
대신을 사용 하는 내 실수로 인해이 문제를 디버깅하는 데 10 분을 보냈습니다 std::abs
. 나는 using namespace std;
추론 할 것이라고 std::abs
생각했지만 그렇지 않고 대신 C 버전을 사용했습니다.
어쨌든 의도를 명확하게 문서화하는 방법으로 부동 소수점 입력 fabs
대신 사용 하는 것이 좋다고 생각합니다 abs
.
답변
std::fabs
부동 소수점 입력을 명시 적으로 권장 하는 또 다른 이유가 있습니다.
당신이 <cmath> 포함하는 것을 잊지 경우, 당신은 std::abs(my_float_num)
할 수 있습니다 std::abs(int)
대신 std::abs(float)
. 눈치 채기 어렵습니다.
답변
“abs”와 “fabs”는 모호한 오버로드 메시지없이 변환 될 수있는 C ++ float 유형에 대해서만 동일합니다.
g ++ (g ++-7)을 사용하고 있습니다. 템플릿 사용과 함께 특히 mpreal을 사용할 때 하드 “모호한 과부하”메시지가있는 경우 abs(static_cast<T>(x))
가 있습니다. 항상 문제가 해결되지는 않습니다. 복근이 모호하면 팹이 예상대로 작동 할 가능성이 있습니다. sqrt의 경우 그러한 간단한 탈출구를 찾지 못했습니다.
몇 주 이후로 저는 “기존 문제가 아닌”C ++에서 고군분투하고 있습니다. 이전보다 더 많은 템플릿 사용을 위해 이전 C ++ 프로그램을 C ++ 14로 업데이트하고 있습니다. 종종 동일한 템플릿 매개 변수가 실제 표준 float 또는 복합 유형 또는 클래스 유형일 수 있습니다. 왜 그래도 long double은 다른 유형보다 다소 합리적입니다. 모두 작동하고 있었고 전에 mpreal을 포함 시켰습니다. 그런 다음 기본 float 유형을 mpreal로 설정하고 구문 오류가 많이 발생했습니다. 그것은 예를 들어 abs 및 sqrt에 대한 수천 개의 모호한 과부하를 제공하여 다른 솔루션을 요구했습니다. 일부는 오버로드 된 도움말 기능이 필요했지만 템플릿 외부에있었습니다. 0.0L 및 1.0L의 천 사용을 개별적으로 Zero 또는 One 또는 type_cast를 사용하는 정확한 상수 유형으로 대체해야했습니다. 모호함으로 인해 자동 변환 정의가 불가능했습니다.
5 월까지는 기존의 암시 적 변환이 매우 훌륭하다는 것을 알았습니다. 그러나 그것이없는 것이 훨씬 더 간단 할 것이고, 다른 표준 상수 유형에 안전한 명시 적 type_cast를 가진 상수를 typeave하는 것이 훨씬 더 간단 할 것입니다.