Доброго времени суток уважаемые форумчане. Возникла следующая проблема:
Во вложенном файле есть немаленькая таблица и стоит вопрос о необходимости интерполяции значений из нее. Исчеслительные формулы находятся справа от таблицы в столбцах BK:BP.
Так вот, в полях подсвеченных зеленым вводится исходные значения для интерполяции. Потом в синих ячейках через функции ОКРГУЛВВЕРХ И ОКРУГЛВНИЗ находим ближайшие исходные табличные значения. В оранжевых ячейках через функции ИНДЕКС и ПОИСКПОЗ находим соответствующие табличные значение. В желтых ячейках проводим интерполяцию по горизонтали, в серых - по вертикали и получаем нужное нам проинтерполированное значение.
И тут возникает вопрос. Этот алгоритм то работает, то нет, в зависимости от указанных в зеленых ячейках значений. При этом я не могу проследить тенденции почему в одних случаях это работает, а в других - нет. Все цифры были введены вручную, не скопированы и не импортированы. на наличие скрытых пробелов вроде проверил.
Что интересно, алогичные алгоритмы, но на меньших массивах работали исправно.
Вы знаете о понятии абзацев? Отредактируйте сообщение.
О примере Пример - не рабочий файл. Не нужны в примере лишние данные, они отвлекают. Зачем показывать вычисление интерполяции, если ошибка возникает еще до этого? Зачем второй лист? Зачем стольо столбцов с данными? Без них не воспроизвести проблему? Лишнее отвлекает. на него теряется время (а модератору - еще и сообщение писать ). Упростите пример. Это, возможно, ускорит помощь.
Пока что похоже на глюк функции. Если еще раз округлить - работает. =ОКРУГЛ(ОКРУГЛВВЕРХ(BK3;1);1)
Почему так - сказать не могу, и правда если ввести четко 97.7 то находит, а при округленном нет, но я б ваще отказался от поиска, если конечно это не просто пример, у вас фиксированный период, можно просто так =INDEX($A$1:$BI$102;2+($A$2-$BL3)/0,1;2+($B$1-BM$2)/0,1) ну или =INDEX($A$1:$BI$102;2+($A$2-$BL3)*10;2+($B$1-BM$2)*10)
Огромное спасибо за помощь с повторным округлением. Прошу прощения за некорректно оформленный пост. Это мой первый опыт общения на форумах за очень долгое время. А большой массив я оставил, потому что на маленьких таблицах все работало нормально. Думал, может причина как раз кроется в том, что таблица большая.
sokol92, Владимир, и да и нет. В данном случае простое сравнение показывает что значения равны. но MATCH не находит. А то что происходит при повторном округлении , тем долее странно, типа два раза округлить и все ок.
Здравствуйте, Михаил! Напоминаю, что Вы работаете с рациональными аппроксимациями (знаменатель - степень двойки) нецелых чисел, MATCH ищет точное совпадение. В случае арифметических операций с нецелыми числами (кроме дробей со знаменателем, равным степени 2) никогда нельзя поручиться за последний разряд. Функции округления просто уменьшают погрешность аппроксимации до минимально возможного значения.
sokol92, Владимир, степень двойки как для ROUND, так и для ROUNDUP должна быть релевантна. Почему =ROUND(BK2+0,05;1) проблему, которая присутствует в случае =ROUNDUP(BK2;1)
Михаил, повторюсь, что в приближенных вычислениях при аппроксимации бесконечных периодических дробей за последний разряд никогда нельзя поручиться. Полагаться на то, что в компьютерных вычислениях (в двоичной системе счисления) 22.1+0.1=22.2 как в #7 - ошибка. С целыми числами (в известном диапазоне) таких "казусов" не случается.
О приближенных вычислениях. Похоже на правду... Но как объяснить, что при повторном округлении ошибки нет? Значение в ПОИСКПОЗ не знает, что в ячейке формула, функция берет уже готовенькое значение. А оно, готовенькое. что при одинарном, что при двойном округлении одинаково (внешне - не верь глазам своим?) и равно константе, введенной вручную.