Задать вопрос
@dikysa
Студент

Как найти общую часть у вещественных чисел?

Дан список вещественных чисел типа double. Необходимо найти общую часть у данных вещественных чисел. Как это сделать побыстрее? Можно ли как-то через битовые операции?

Пример 1.
число 0 = 15.0123567
число 1 = 15.0123593
общая часть = 15.01235, так как отличия идут с 6 знака после запятой

Пример 2.
число 0 = 0.000123
число 1 = 102.00123
общая часть = 0.0, так как отличия идут сразу

Пример 3.
число 0 = 1.234578e-10
число 1 = 1.234567e-10
общая часть = 1.2345e-10, так как отличия после цифры 5

Если кому интересно откуда возникла данная задачка. Нужно было найти площадь полигона на плоскости, который задан множеством точек (x_i, y_i) i = 0...N. Использовал формулу площади Гаусса. Начал гонять тесты и получил интересную картину, когда координаты точек были очень сильно близки к друг другу. Например 1.1234567891***** (то есть отличаются где стоят *), то площадь получалась отрицательной... хотя на самом деле площадь была положительной если использовать числа с большей точностью. Отсюда возникла идея того, как исправить данную проблему, так это сместить координаты точек так чтобы из 1.1234567891***** стало бы *.****00000000000e-11. Я знаю и другое решение, но я вообще не понимаю как оно работает, дело в том, что если умножить все координаты скажем на 1e6, потом найти площадь по формуле Гаусса, затем разделить площадь на 1e12, то получим положительную площадь.
  • Вопрос задан
  • 215 просмотров
Подписаться 1 Средний 5 комментариев
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Через битовые операции вы ничего не сделаете, потому что у вас, судя по всему, надо найти общие цифры в десятичной системе счисления. Вообще найти десятичные цифры у вещественных чисел - весьма сложная операция.

Я думаю, вам остается только вывести оба числа в строки в каком-нибудь фиксированном формате и дальше сравнивать посимвольно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nikonor
@nikonor
Программист go, perl
а как во втором примере получилось 0.0? что вообще имелось в виду тогда под общей частью?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы