math.h
을 사용할 때 abs
과 fabs
이 서로 다른 것으로 가정합니다. 하지만 cmath
과 std::abs
만 사용하는 경우 std::fabs
또는 fabs
을 사용해야합니까? 아니면 정의되지 않았습니까?팹을 언제 사용해야하며 언제 std :: abs를 사용하는 것으로 충분합니까?
답변
C++의 경우 항상 std::abs
만 사용하면 충분합니다. 그것은 모든 숫자 형에 대해 오버로딩됩니다.
C에서 abs
은 정수에서만 작동하며 부동 소수점 값은 fabs
이어야합니다. C++ (모든 C 라이브러리와 함께)에서 사용할 수 있지만 사용하지 않아도됩니다.
double
및 float
인수에는 여전히 fabs
을 사용해도됩니다. 나는 그것이 우연히 std::
을 abs
에서 벗겨 내면 동작이 부동 소수점 입력에 대해 동일하게 유지되도록하기 때문에이 방법을 선호합니다.
std::abs
대신 abs
을 사용하는 실수로 10 분이 지났습니다. 나는 using namespace std;
이 std::abs
을 유추한다고 추측했지만 그렇지 않았으며 대신 C 버전을 사용하고있었습니다.
어쨌든 부동 소수점 입력에 대해서는 abs
대신 fabs
을 사용하는 것이 좋습니다. 이것은 의도를 명확하게 문서화하는 방법입니다.
이상 하네. 귀하의 전화가 모호했기 때문에 (따라서 오류가 발생 했음) 맞습니까? – Nick
플로트 용 fabsf를 사용해야합니까? 그래서 나는 그들이 동일하다고 생각하지 않는다. – Nick
안드로이드 NDK g ++에주의하십시오, 그것은 또한 std :: abs() 대신에 abs() 함수를 cedes합니다. Visual Studio에서 C++ 컴파일러 그러나 abs는 항상 std :: abs()를 가리 킵니다. – southerton
명시 적으로 부동 소수점 입력에 std::fabs
을 권장하는 이유가 하나 더 있습니다.
당신이 <cmath>을 포함하는 것을 잊지 경우
, 당신의std::abs(my_float_num)
는
std::abs(int)
대신
std::abs(float)
수 있습니다. 알아 차리기가 어렵습니다.
"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 상수를 가질 수 있습니다.
- 1. CSS에서는 언제 id를 사용해야하며 언제 수업을 사용해야합니까?
- 2. C# List는 언제 사용해야하며 언제 arraylist를 사용해야합니까?
- 3. 언제 데이터 그리드를 사용해야하며 언제 데이터 그리드 뷰를 사용해야합니까?
- 4. 언제 datacontract를 사용해야하며 WCF에서 messagecontract를 사용해야합니까?
- 5. 언제 직접 초기화를 사용해야하며 초기화를 복사해야합니까?
- 6. 언제
- 7. 언제 자바 @Override를 사용하는
- 8. 언제 예상하고 언제 스텁을합니까?
- 9. 데이터베이스에 저장된 열거 형은 언제 사용해야하며 코드에서 열거 형을 사용해야합니까?
- 10. 언제
- 11. 언제
- 12. 언제 std :: iostream :: sentry에 신경 써야합니까?
- 13. 언제 EAR을 사용하는 것이 적절하며 언제 앱이 WARs에 있어야합니까?
- 14. 언제 NOLOCK을 사용하는 것이 적당합니까?
- 15. IOC 용기는 언제 사용합니까?
- 16. NameSpaces 언제, 어디서, 왜!
- 17. 언제 LINQ
- 18. 언제 레이아웃을 사용하고 활동을 언제 사용합니까?
- 19. 언제 NSDocument를 연장해야합니까? NSWindowController를 언제 연장해야합니까?
- 20. 언제 initWithNibName을 사용하여보기 컨트롤러를 초기화해야합니까?
- 21. mySQL : 언제 업데이트해야하는지, 언제 삽입해야하는지 알고 있습니까?
- 22. 인스턴스 변수는 언제 사용되며 속성은 언제 사용됩니까?
- 23. 언제 sIFR을 사용합니까?
- 24. 언제 Xcode
- 25. 언제 EF4에서 POCO를 사용해야합니까?
- 26. 이름을 언제 가입하지 않을까요?
- 27. 템플릿에 사용되는 함수는 언제 선언해야합니까?
- 28. 웹 서비스를 요청할 때 PHP에서 set_time_limit을 사용하는 것으로 충분합니까?
- 29. SBT는 언제 Scala 2.8로 포팅 될 것으로 예상됩니까?
- 30. RIA에서 지연로드는 언제 문제가됩니까?
모든 플랫폼의 케이스에 해당합니까? Esp. Windows 및 Mac OS X? 또는 적어도 C++ 표준에 있습니까? – math
@brubelsabs : 예. C++에는 함수 오버로드가 있기 때문에 별도의 fabs 함수가 필요하지 않습니다 (abs는 다양한 유형에 대해 정의 될 수 있으며 C++에 있습니다). 그것은 또한 표준에 의해 보장됩니다. 물론 10 년이 넘은 오래된 컴파일러를 찾아 보시면 지원하지 않는 컴파일러를 찾을 수 있습니다. – stinky472
이것은 C++ 표준에 있습니다. 따라서 Windows와 Mac OS X를 포함한 알맞은 컴파일러를 가진 모든 플랫폼에서 마찬가지입니다. 26.5 절에 C 라이브러리의 int 버전 외에'long ','float','double'과'long double'을 사용합니다. 26.2.7 절은'complex'에 대한 과부하를 정의합니다. –