Рациональные числа

Предыдущая тема Следующая тема Перейти вниз

Рациональные числа

Сообщение  Саня в Вс Янв 09, 2011 2:06 am

Я тут создал реализацию класса рациональных чисел, прошу отзывов, замечаний, дополнений...Класс Ratio_ сделан для целых знаковых чисел( Integer ) в числителе и целых чисел без знака ( Uinteger ) в знаменателе. Для доступа к числителю используется свойство numerator, к знаменателю - denominator. Любое число представлено в виде несокращаемой дроби.Для приведения к рациональному виду используется функция Ratio ( как название типа, но без постфикса "_" ).
Имеется приведение к типу String и WString ptr. Если числитель - 0, то строковое будет "0", если больше нуля, то "Числитель/Знаменатель", иначе - "(Числитель/Знаменатель)". Примерно такое же представление распознает один из конструкторов и Ratio, и переводят в рац.число, но могут возникнуть неприятности из-за нахождения общего делителя вещ.чисел( появляются неточности при нахождении mod ) => нужно опасаться, что если в строке окажется вещ.число с ненулевой дробной частью, то результат может быть неопределенным...
Методов мало, лишь некоторые необходимые, а это:

Opposite - противоположная дробь, меняет знак числителя. Фактически, то же самое, что унарный минус
Reciprocal - обратная дробь, числитель и знаменатель меняются местами, но дроби 0/1 соответствует 1/1, также как и для 1/1.
Height - высота рац.числа
FracPart - возвращает дробную часть, целое , к примеру - число 10/3, FracPart будет равен 1, фактичски, это результат целочисленного деления числителя на знаменатель.
Assign - принимает два параметра:
1) числитель,
2) знаменатель.
Используется для присваивания переменной нового значения, описываемого в параметрах.

Is_mixed - типа BOOL_, если дробь смешанная то возвращает значение TRUE ( -1 ), иначе FALSE (0).

Определены почти все операторы, за исключением некоторых побитовых... Может немного удивить, но
Код:

? Ratio ( 3 ) \ Ratio ( .2 )
sleep

вернет 15/1 , а не ошибку деления на нуль, как для вещественных
Код:

? 3.0 \ .2
Это происходит из-за того, что сначала все приводят к единому знаменателю, потом делится, но позже знаменатель заменяется на 1. Это же характерно для Mod. Есть операторы для организации цикла for. Если Step не указан, то числитель будет увеличиваться при каждой итерации на значение знаменателя, пример
Код:

For i as Ratio = 1. / 3. to 5      '  1. / 3.  это деление блин
 ? i
next
 ' Out:
 '    1/3
 '    4/3
 '    7/3
 '  и т.д.
К сожалению операции деления, практичски не защищены от деления на ноль и в данной ситуации результат не определен( ну если тока чуток покопатся в каждой отдельной ситуации), но скорее всего это экстренный выход из проги , поэтому с этим надо быть внимательным и самостоятельно проверять на возможность такой "операции".
Перевод и вещественного в рациональное не всегда корректен, в том смысле, что дается дробь близкая, но не всегда самая оптимальная и судя по всему там есть ошибки,
Код:

? Ratio( .666)            '  333/500
? Ratio( .666666)        '  ( -1620316138/3296442777)  ' - походу переполнение.
? Ratio( .66666666)    '  2/3
sleep
Дополнительно для этого класса требуется функция для наибольшего общего делителя( Gcd) и наименьшего общего кратного( Lcm ), находщегося в файле Gcd.bas, там же сделан макросы GCD__ и LCM__, создающие соответственные функции. у них один параметр - это тип аргументов, которые должен принимать функция( к примеру GCD__ ( ubyte ), создает функцию
GCD( a as ubyte, b as ubyte) as ubyte
Функции всегда возвращают числа без знака.

math.rar
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения