Страницы: 1
RSS
Ошибка Экселя в функции СУММ - откуда она берется?, Ошибка Экселя в функции СУММ - откуда она берется?
 
Здравствуйте. После 25 лет работы с Экселем получил нежданчик - явную ошибку (ОШИБИЩУ) в функции СУММ. Это же самая простая и самая часто используемая функция Эксель. Хотелось бы понять откуда она появляется, при каких ситуациях.
А моя ситуация очень-очень простая: есть около полусотни числовых значений, максимум с двумя значащими знаками после запятой. Суммируем их вышеназванной функцией и вуаля: значение функции в ячейке A48 =СУММ(A1:A47), не совпадает с реальной суммой чисел данного множества на единицу в 12-м (почему именно в 12-м?) разряде. Ведь это не деление 10 на 3, не взятие корня или что-то еще этакое - это элементарная арифметика, суммирование: 2+2=3,999999999999. Откуда такая ошибка? Причем, что интересно, если удалить любое число из данного множества - ошибка исчезает.
Вопрос к знатокам и одновременно просьба: объясните пожалуйста, по какой причине именно при таком наборе данных появляется эта ошибка, почему она исчезает, если убрать любое число из множества, почему не возникает при других наборах данных и, проанализировав причину ее появления, как эту ошибку избежать?
Спасибо.  
 
Barmaldon, если интересно почитайте статью
Здесь только посоветовать как бороться:
=ОКРУГЛ(СУММ(A1:A47);2)
 
Цитата
Barmaldon написал:
Ведь это не деление 10 на 3, не взятие корня или что-то еще этакое - это элементарная арифметика,
Добро пожаловать в мир приближенных вычислений в двоичной арифметике!
Уже первое число (ячейка A1) 3,58 представляет собой бесконечную периодическую дробь в двоичной системе счисления и не может быть точно представлено в используемом формате double.
На тему приближенных вычислений на форуме есть много статей.
Владимир
 
Павел \Ʌ/, sokol92, Спасибо за ответ, но что удивляет, что я четверть века с экселем, вел на нем огромное количество всего всякого и НИКОГДА не сталкивался с такой проблемой. Регулярно для поиска или исключения ошибки я сравнивал контрольные суммы огромных массивов данных и всегда все совпадало тютя в тютю (если разумеется не было реальной ошибки, НЕ связанной с потерей или "рождением" единицы в одном из младших разрядов. Про функцию округления я разумеется знаю, но никогда не возникало надобности применять ее именно с такой целью.
Для проверки гипотезы о том, что такая ошибка не проявляется регулярно, в свой файл (см. измененный файл в данном месседже) я добавил колонку C - это случайные числа от 0 до 100 с двумя цифрами после запятой. Внизу стоит аналогичная функция СУММ. Но сколько бы я не обновлял лист со случайными числами из колонки С, ни разу не было "кривой" суммы в колонке С, всегда было две значащих цифры после запятой и никаких девяток в периоде. Как вы можете объяснить этот факт? Получается, что в первичной колонке А содержится какой-то попросту мистический набор чисел, который в сумме дает "кривое" число как результат функции СУММ, ведь никакие другие наборы чисел не дают такой "кривой" суммы. Более того, если удалить любое число из колонки А - "кривая" сумма исправляется! Так как же с остальными числами из этой колонки? Например, удалите А2 и сумма будет "ровной", несмотря на то, что как вы пишите "Уже первое число (ячейка A1) 3,58 представляет собой бесконечную периодическую дробь в двоичной системе счисления и не может быть точно представлено в используемом формате double." То есть очевидно, что причина в чем-то ином. В чем?
 
Расширил Ваш пример до 999 строк.
Если несколько десятков раз нажать на F9 (пересчет формул), то в некоторых случаях Вы увидите погрешность.
В каких-то случаях ошибки накапливаются, в каких-то нет...

См. также эту тему.
Изменено: sokol92 - 10.09.2024 20:19:01
Владимир
 
sokol92, Я прочитал теорию о том, как хранятся данные с плавающей точкой. Понятно, что эксель хранит аналогично и использует стандарт IEEE 754. Непонятно другое: почему в большинстве случаев этого округления не видно (например число 0,1 в двоичной системе имеет бесконечный периодический "хвост", но тем не менее в экселе =0,1+0,1 дает 0,2, а не 0,1999999999999998 или 0,20000000000002, но в некоторых случаях, это неровность пролазит. Причем совершенно непонятно и нигде не описано - в каких же именно случаях в экселе пролазит подобная "кривизна".
 
Интересный вопрос.
Посмотрите раздел "Неточные вычисления" в этой замечательной статье.
Там, например, показано, почему в "машинной" арифметике 0.1+0.2 не равно 0.3.
Тем не менее, в Excel Вы увидите другой результат.

Разработчики Excel проделали огромную работу, чтобы снизить количество вопросов, аналогичных Вашему.  Вы и сами это указали - за 25 лет возникло впервые. Исходный код Excel мне не доступен, так что эта работа остается "под капотом".

Тем не менее, простые правила работы с дробными числами никто не отменял:
1. При любых арифметических операциях числа должны быть округлены до заданной точности (если существует). Например, суммы в бухгалтерских расчетах всегда должны округляться до копеек.
2. Для отображения дробных чисел не следует использовать "общий" формат ячеек.
Владимир
Страницы: 1
Наверх