Эксель и НОД

Делал по работе таблицу с концентрациями вещества. Мне нужно было получить колонку с пропорциями и использовал в экселе функцию НОД (наименьший общий делитель, если кто не знает).

Столкнулся с вот таким интересным явлением (это уже не мои вычисления а попытка разобраться в ошибке с концентрацией 55%):

Эксель и НОД Microsoft Excel, Таблицы Excel, Математика, Ошибка, Задача, Длиннопост

Первых две колонки - это числа (изначально - целые). В правой колонке - их НОД.

Эксель и НОД Microsoft Excel, Таблицы Excel, Математика, Ошибка, Задача, Длиннопост

То же самое, только с отображением формул.

Чудесно, не правда ли? В какой-то момент эксель перестаёт адекватно воспринимать полученное в вычислении число и возвращает феерический результат.

Мне уже стало совсем интересно и я решил прогнать расчёт от 1 до 100%.
Чтобы не городить сложных формул, я делал промежуточные решения в столбцах. Так легче отследить ошибку.
И вот когда я на это посмотрел... я был удивлён.

Это значения (с формулами можно ознакомиться в файле по ссылке). Оранжевым я выделил ошибки.

Из всего этого ряда мне изначально нужно было всего 20 значений. Но посчастливилось поймать ошибку и я полез разбираться.
На первый взгляд кажется, что у экселя проблема с простыми числами. Но нет, он даже для чётных чисел после 2-3 вычислений не способен выдать результат. У чётных чисел НОД = 1.

Эксель и НОД Microsoft Excel, Таблицы Excel, Математика, Ошибка, Задача, Длиннопост

Более того, стало заметно, что точность операций с плавающей запятой - непредсказуема.
Например, НОД (20;80) он считает верно, а НОД (80;20) - уже не может. Хотя результат должен быть одинаковый.
Получается, что алгоритм вычисления НОД очень чувствителен и перед ним надо числа округлять до целых.

Используется Excel 2019. Вот прилагаю файл, если кому интересно:
https://docs.google.com/spreadsheets/d/16RMazU_jAGKAg3UHpIYL...

У кого есть возможность проверить формулы в своём экселе - какой результат покажет вам?
В комментариях указывайте версию своего экселя (или офиса).

15
Автор поста оценил этот комментарий
https://support.microsoft.com/ru-ru/office/функция-нод-d5107a51-69e3-461f-8e4c-ddfc21b5073a
Синтаксис
НОД(число1;[число2];...)
Аргументы функции НОД описаны ниже.
Число1, число2,... Число1 является обязательным, последующие числа — нет. От 1 до 255 значений. Если какое-либо из этих чисел не является целым, оно усекается.
Усекается, а не округляется.

Сейчас это в школе на информатике проходят. Из-за особенностей работы АЛУ процессора (а не "Экселя"), число, которое вы задали как 0,55, не может в точности равняться 0,55, оно чуть больше. Соответственно, при умножении на 100 оно даёт:

55,00000000000001 (эта запись тоже неточно отражает число, которое насчитал процессор, но истинное число - 55 с небольшой добавкой).

В функции "НОД" оно усекается до 55.

А 100 - 0,55 * 100 даёт 44,99999999999999 и усекается до 44.

НОД(55, 44) = 11.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Интересно (по ссылке вообще нет этого, там стандартная отписка).

Сейчас это в школе на информатике проходят.

У нас и в универе 15 лет назад такое не проходили. Может быть айтишникам давали. Инженеров объехали, только 6 лет фортран впихивали в мозг.

число, которое вы задали как 0,55, не может в точности равняться 0,55, оно чуть больше

ну про ограничения экселя в 15 разрядов я знаю. и про то, что в экспоненциальной форме там до 10^308 можно.

я бы понял, если бы эти ошибки вылезли где-то через 15-20 вычислений. а не на 2-3 итерации.

получается, что и правда надо предварительно округлять.

показать ответы
0
Автор поста оценил этот комментарий
Ну когда у тебя массивные формулы и куча вычислений, то во первых тебе лучше знать где отсекать, а где округлять, а два, вшитая функция на округления всего еще сильнее нагрузит вычисления, да и потом округлять можно, а до какого знака?
раскрыть ветку (1)
Автор поста оценил этот комментарий
вшитая функция на округления всего еще сильнее нагрузит вычисления

а не вшитая, вручную дописанная не нагрузит? учитывая, что там без неё никак?

округлять можно, а до какого знака?

ну очевидно же - до целых. НОД - это функция для натуральных чисел.

1
Автор поста оценил этот комментарий
Интересно (по ссылке вообще нет этого, там стандартная отписка).

Я же процитировал.

Инженеров объехали, только 6 лет фортран впихивали в мозг.

Вот как? Я тоже учил фортран (что там учить-то 6 лет?), ниже объяснение проблемы из советского учебника по фортрану.

ну про ограничения экселя в 15 разрядов я знаю. я бы понял, если бы эти ошибки вылезли где-то через 15-20 вычислений. а не на 2-3 итерации.

Это ограничения процессора. И дело не в 15 разрядах, а в том, что нельзя задать число 0.55 в виде конечной двоичной дроби. Вот не эксель, ошибка возникает уже в первом действии. Даже без действия возникает: когда вы пишете в почти любом языке программирования 0.55, на самом деле в память записывается число, несколько большее 0.55.

Иллюстрация к комментарию
Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий
что там учить-то 6 лет?

Ну явно не сам фортран.

Прикладные задачи. Уравнения Навье-Стокса и всякое прочее.

Это ограничения процессора.

Классные у нас процессоры.

Странно, что я раньше с этой проблемой не сталкивался. Хотя в экселе кучу расчётов проводил. Видимо дело в том, что обычно мне нужны результаты не целочисленные.

0
Автор поста оценил этот комментарий
Это не Ексель дурак, а ручками округление нужно добавлять. Когда вычисления делаешь.
раскрыть ветку (1)
Автор поста оценил этот комментарий

он не дурак, а особенный. да-да. знаем мы, куда это ведёт. =)

странно, что программисты микрософт не додумались для этой функции сразу зашить округление аргументов.

показать ответы
1
Автор поста оценил этот комментарий
Вам уже написали причину. Для исчисляемых значений просто добавь округл
раскрыть ветку (1)
Автор поста оценил этот комментарий

С причиной я разобрался. Спасибо.

Автор поста оценил этот комментарий

У меня что 20 80, что 80 20 показывает верно - 20. Офис 21 года

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

так у вас 20 и 80 заданы или это вычисляемые значения?

показать ответы