В программировании на 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)
, гдеSMALL
определяется как очень маленькое значение, например1E-30
? - Наконец, могут ли небольшие возмущения привести к отрицательному значению? Потому что, если это возможно, мне лучше использовать
if (abs(SUM) < SMALL)
.
Есть опыт?