2016-07-17 7 views
-2

벡터에서 스칼라를 뺀 다음 결과를 벡터로 반환하는 템플릿 연산자 함수를 만들려고합니다. 아래의 기능은 내가 가지고 올 수 있었던 것입니다 : 벡터에서 스칼라 (플로트)을 빼기 할 때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). 피연산자가 일반 산술 변환 (필수 프로모션 포함)을 거치기 때문에 문제가 의심됩니다.

DEMO

+1

"올바르지 않습니다"및 "잘못된 결과"는 유용한 문제 설명이 아닙니다. 간단한 테스트는'std :: vector '을 사용하고'float' 스칼라는 올바른 값을 가진'std :: vector '결과를 사용하여 예상 된 결과를 만든다. 재현 할 수 없습니다. "잘못된 결과"를 정의하십시오. –

+0

@Sam Varshavchik, 데모의 목적은 문제를 재현하는 것이 었습니다. 어쨌든, 예제는 다음을 보여줍니다. v - s = (1, 2, 3) - 2.1 = (-1.1, -0.0999999, 0.9). 올바른 결과는 [-1.1f, -0.1f, 0.9f] 벡터입니다. 두 번째 요소는 -0.0999999이고 다른 요소는 옳다는 것이 나에게는 놀라운 사실입니다. – bobster

+1

아니요,이 결과는 정확합니다. 당신이 누락 된 사실은 [부동 소수점 숫자가 정확하지 않고 C++ 또는 가장 최신의 프로그래밍 언어에서 정확한 적이 없다는 것입니다] (http://stackoverflow.com/questions/588004/is-floating-point-math -부서진). –

답변

1

이 있지만 부동 소수점 숫자가 정확하지 않은 사실과, 템플릿과는 아무 상관이 없습니다. 자신이 컴파일, 그 결과가 무엇인지 볼 수

float subtract(float a, float b) 
{ 
    return a-b; 
} 

int main() 
{ 
    std::cout << subtract(2, 2.1) << std::endl; 

    return 0; 
} 

시도 :

이 같은 "잘못된 결과"를 특별히 코멘트에서 인용을 생산하고 있습니다.

또한 -0.0999999입니다.

멋진 부동 소수점 수학 세계에 오신 것을 환영합니다.

정확한 고정밀 수학이 필요한 경우이를 구현하는 특수 라이브러리가 있습니다.

+0

당신은 정확합니다. 템플릿과는 아무 관련이 없습니다. 단지 C/C++ 부동 소수점 연산이 정확하지 않습니다. 나는 동등한 연산자에서 Bruce Dawson (https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/)에 의해 "AlmostEqual2sComplement"메소드를 사용해 보았습니다. 약간의 조정이 필요합니다. – bobster