我正在尝试创建一个模板运算符函数,用于从向量中减去标量并将结果返回到向量中。以下功能是我能够提出的:
// 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)时,结果不正确。我怀疑问题是因为操作数经历了通常的算术转换,其中包括整数促销。
答案 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。
欢迎来到浮点数学的精彩世界。
如果您需要精确的固定精度数学,可以使用专业库来实现它。