Эксель и НОД

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

Столкнулся с вот таким интересным явлением (это уже не мои вычисления а попытка разобраться в ошибке с концентрацией 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Более того, просто при сложении и вычитании такие ошибки вскрываются в экселе, когда речь идёт о значения после запятой (например 0,1+0,2-0,3 уже не равно нулю, а 5,55111512312578E-17). Из-за этого в самые непредсказуемые места приходиться вставлять округления. как правило при сравнении значения.

Автор поста оценил этот комментарий
что там учить-то 6 лет?

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

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

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

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

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку