Как карманные калькуляторы упрощают дроби и сохраняют неточные числа в виде дробей? - PullRequest
3 голосов
/ 25 марта 2012

Может ли кто-нибудь объяснить, как калькуляторы (например, карманные казино) управляют уравнениями, такими как «500/12», и могут в результате вернуть «125/3», в качестве альтернативы кто-то может назвать некоторые алгоритмы, которые делают это?

Под неточными числами я подразумеваю числа, которые нельзя представить в фиксированном количестве десятичных разрядов, например, 0,333 повторяющихся.

Windows калькулятор может продемонстрировать это, если вы выполните «1/3», вы получите «0,3333333333333333» в качестве ответа, но затем, если вы умножите это на 3, вы вернетесь к «1».

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Я бы посоветовал вам взглянуть на функции рациональных чисел библиотеки GMP .В какой-то момент вам нужно будет принять конечную точность в ваших вычислениях, если последовательность операций не является особенно простой.Иррациональные числа (трансцендентные функции / константы) могут быть аппроксимированы только, например, как непрерывные дроби.

1 голос
/ 25 марта 2012

Отображение доли моего HP позволяет вам установить несколько режимов отображения дроби:

  • Установить максимальный знаменатель. Отображаемая дробь n/d ближе всего к внутреннему значению с плавающей запятой, при этом d не превышает максимальное значение. Например, если максимальное значение равно 10, число с плавающей запятой для pi является ближайшим к дроби 22/7. Однако, если максимум равен 1000, то ближайшая дробь равна 355/113.

  • Установите точный знаменатель и уменьшите результат. Отображаемая дробь является n/d ближайшим к внутреннему значению с плавающей запятой, где d равно точному знаменателю. Вычислив n , затем доля уменьшается на наибольший общий знаменатель. Например, если знаменатель установлен равным 32, то число с плавающей запятой 0,51 является ближайшим к 16/32, которое уменьшается до 1/2. Аналогично, число с плавающей точкой 0.516 является ближайшим к 17/32, что является неприводимым.

  • Установите точный знаменатель и не уменьшайте результат. Например, 0,51 отображается как 16/32, невосстановленная дробь.

Алгоритм подхода с максимальным знаменателем использует непрерывные дроби . Простой пример в Python можно найти в методе limit_denominator по адресу http://hg.python.org/cpython/file/2.7/Lib/fractions.py#l206.

Метод точного знаменателя проще. Учитывая знаменатель d и число с плавающей запятой x , числитель просто d * x округляется до ближайшего целого числа. Затем уменьшите дробь n/d, вычислив наибольший общий делитель.

При желании исходное число с плавающей запятой можно заменить отображаемой дробью. Это известно как привязка к сетке. Таким образом, вы можете ввести 0,333, чтобы создать дробь, равную точно , равную 1/3. Это позволяет вам выполнять точную дробную арифметику без округления.

Надеюсь, этот ответ все прояснит для вас :-) Дайте мне знать, если какая-то часть нуждается в доработке или дополнительном объяснении.

...