Рациональные числа
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Рациональные числа
Я тут создал реализацию класса рациональных чисел, прошу отзывов, замечаний, дополнений...Класс 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).
Определены почти все операторы, за исключением некоторых побитовых... Может немного удивить, но
Перевод и вещественного в рациональное не всегда корректен, в том смысле, что дается дробь близкая, но не всегда самая оптимальная и судя по всему там есть ошибки,
GCD( a as ubyte, b as ubyte) as ubyte
Функции всегда возвращают числа без знака.
math.rar
Имеется приведение к типу 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
- Код:
? 3.0 \ .2
- Код:
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( a as ubyte, b as ubyte) as ubyte
Функции всегда возвращают числа без знака.
math.rar
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|