2012-03-24 6 views
3

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

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

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

+3

Один не просто .... держите неточные числа в виде дробей. corsiKa

+0

Калькулятор Windows не делает ничего интересного - это просто случай, когда результат достаточно близок к 1, что он округляется до 1 в номере с плавающей точкой IEEE. –

ответ

1

Мой дисплей пусть НР Фракцию ты установить несколько режимов отображения дроби:

  • Установить максимальный знаменатель. Показанная доля равна 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, нередуцированная фракция.

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

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

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^