벡터에서 스칼라를 뺀 다음 결과를 벡터로 반환하는 템플릿 연산자 함수를 만들려고합니다. 아래의 기능은 내가 가지고 올 수 있었던 것입니다 : 벡터에서 스칼라 (플로트)을 빼기 할 때C++ 템플릿 연산자가 벡터에서 스칼라를 뺄 때 잘못된 결과를 나타냅니다.
// vector - scalar
template<typename T1, typename T2>
auto operator - (const Vector<T1> & lhs, const T2 & scalar)-> Vector<std::common_type_t<T1,T2>>
{
using T3 = std::common_type_t<T1, T2>;
Vector<T3> result;
result.base.reserve(lhs.base.size());
std::transform(lhs.base.begin(), lhs.base.end(), std::back_inserter(result.base),
[&scalar](const T3 & element) { return element - scalar; });
return result;
}
그러나, 결과가 정확하지 (INT). 피연산자가 일반 산술 변환 (필수 프로모션 포함)을 거치기 때문에 문제가 의심됩니다.
"올바르지 않습니다"및 "잘못된 결과"는 유용한 문제 설명이 아닙니다. 간단한 테스트는'std :: vector'을 사용하고'float' 스칼라는 올바른 값을 가진'std :: vector '결과를 사용하여 예상 된 결과를 만든다. 재현 할 수 없습니다. "잘못된 결과"를 정의하십시오. –
@Sam Varshavchik, 데모의 목적은 문제를 재현하는 것이 었습니다. 어쨌든, 예제는 다음을 보여줍니다. v - s = (1, 2, 3) - 2.1 = (-1.1, -0.0999999, 0.9). 올바른 결과는 [-1.1f, -0.1f, 0.9f] 벡터입니다. 두 번째 요소는 -0.0999999이고 다른 요소는 옳다는 것이 나에게는 놀라운 사실입니다. – bobster
아니요,이 결과는 정확합니다. 당신이 누락 된 사실은 [부동 소수점 숫자가 정확하지 않고 C++ 또는 가장 최신의 프로그래밍 언어에서 정확한 적이 없다는 것입니다] (http://stackoverflow.com/questions/588004/is-floating-point-math -부서진). –