>백엔드 개발 >C++ >부동 소수점 숫자를 C 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?

부동 소수점 숫자를 C 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-10 01:16:091075검색

Why Can't I Use Floating-Point Numbers as C   Template Parameters?

Float 값이 템플릿 매개변수로 허용되지 않는 이유

C에서는 float 값을 템플릿 매개변수로 사용하려고 합니다. 다음 코드를 사용하면 다음 오류가 발생합니다.

GenericClass<float, 4.6f> gcFloat;
error: `float' is not a valid type for a template constant parameter

표준 금지

C 11 표준에 따르면 비유형 템플릿 인수는 다음 중 하나여야 합니다.

  • 정수 또는 열거 유형의 변환된 상수 표현식
  • 비형 템플릿 매개변수 이름
  • 정적 객체의 주소를 지정하는 표현식 또는 함수
  • 널 포인터
  • 널 멤버 포인터
  • 멤버에 대한 포인터

그러나 부동 소수점 값은 이들 중 어느 것에도 맞지 않습니다.

추론

이 제한의 주된 이유는 부동 소수점 계산의 부정확한 특성 때문입니다. 부동 소수점 계산은 정확하게 표현할 수 없으므로 이를 템플릿 인수로 사용할 때 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 다음 코드는 잠재적인 반올림 차이로 인해 의도한 대로 작동하지 않을 수 있습니다.

func<1/3.f>();
func<2/6.f>();

대체 솔루션

부동 소수점 값을 템플릿 인수로 표현하려면 다음을 고려하세요. C 11의 고급 상수 표현식(consexpr)을 사용하여 컴파일 타임에 부동 값의 분자와 분모를 계산합니다. 그런 다음 이를 별도의 정수 인수로 전달할 수 있습니다. 그러나 서로 가까운 부동 소수점 값이 동일한 분자/분모 비율을 생성하도록 임계값을 정의하는 것이 중요합니다.

위 내용은 부동 소수점 숫자를 C 템플릿 매개변수로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.