在 C++ 编程中,我什么时候需要担心精度问题?举一个小例子(虽然它可能不是一个完美的例子),
std::vector<double> first (50000, 0.0);
std::vector<double> second (first);
有没有可能second[619] = 0.00000000000000000000000000001234
(我的意思是一个非常小的值)。或者SUM = second[0]+second[1]+...+second[49999] => 1e-31
?或者SUM = second[0]-second[1]-...-second[49999] => -7.987654321e-12
?
我的问题:
- 在使用
double
类型编号时会不会有一些小干扰? - 什么可能导致这些小干扰?即舍入误差变大?你能把它们列出来吗?如何采取预防措施?
- 如果在某些操作中可能有小干扰,是否意味着在这些操作之后,使用
if (SUM == 0)
是危险的?然后应该始终使用if (SUM < SMALL)
, whereSMALL
被定义为一个非常小的值,例如1E-30
? - 最后,小扰动会导致负值吗?因为如果可能的话,那我应该更好地使用它
if (abs(SUM) < SMALL)
。
有什么经验吗?