从向量中减去标量时,C ++模板运算符会给出错误的结果

时间:2016-07-17 00:38:47

标签: c++ templates lambda integer-promotion

我正在尝试创建一个模板运算符函数,用于从向量中减去标量并将结果返回到向量中。以下功能是我能够提出的:

// 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)中减去标量(float)时,结果不正确。我怀疑问题是因为操作数经历了通常的算术转换,其中包括整数促销。

DEMO

1 个答案:

答案 0 :(得分:1)

这与模板无关,但浮点数并不准确。

这会产生相同的&#34;错误的结果&#34;你在评论中特别提到:

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

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

    return 0;
}

尝试自己编译,看看结果如何。

它也是-0.0999999。

欢迎来到浮点数学的精彩世界。

如果您需要精确的固定精度数学,可以使用专业库来实现它。