Я выяснил, как отобразить повторяющуюся часть повторяющейся десятичной дроби, используя OverBar.
repeatingDecimal
на самом деле не работает как повторяющаяся десятичная дробь. Я хотел бы сделать его вариант, который выглядит и ведет себя как повторяющаяся десятичная дробь.
Вопрос
Как я могу заставить работать с повторением десятичного представления (возможно, используя Interpretation[]
)?
Фон
Пожалуйста, извините, если я бродю. Это мой первый вопрос, и я хотел уточнить, что я имею в виду.
Следующее «нарисует» повторяющийся десятичный знак.
repeatingDecimal[q2_] :=
Module[{a},
a[{{nr__Integer}, pt_}] :=
StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]];
(* repeating only *)
a[{{{r__Integer}}, pt_}] :=
Row[{".", OverBar@StringJoin[Map[ToString, {r}]]}];
(* One or more non-repeating;
more than one repeating digit KEEP IN THIS ORDER!! *)
a[{{nr__, {r__}}, pt_}] :=
Row[{StringJoin[
Map[ToString,
If[pt > -1, Insert[{nr}, ".", pt + 1],
Join[{"."}, Table["0", {Abs[pt]}], {nr}]]]],
OverBar@StringJoin[Map[ToString, {r}]]}];
(* One or more non-repeating; one repeating digit *)
a[{{nr__, r_Integer}, pt_}] :=
Row[{StringJoin[Map[ToString, {nr}]], ".",
OverBar@StringJoin[Map[ToString, r]]}];
a[RealDigits[q2]]]
So
repeatingDecimal[7/31]
отображает правильно повторяющуюся десятичную дробь (показана здесь как картинка, так что появляется OverBar).
![Repeating decimal displayed](https://i.stack.imgur.com/sQJik.png)
Если заглянуть под капот, это действительно просто самозванец, изображение повторяющейся десятичной дроби ...
In[]:= repeatingDecimal[7/31]//FullForm
Out[]:= Row[List[".",OverBar["225806451612903"]]]
Конечно, он не ведет себя как число:
% + 24/31
![fraction plus repeating decimal](https://i.stack.imgur.com/fVznm.png)
Я бы хотел, чтобы дополнение принесло: 1
Редактировать: очищенная версия повторения десятичного
Леонид показал, как обернуть Format вокруг рутины и предоставить повышающие значения для добавления и умножения повторяющихся десятичных знаков. Очень полезно! Мне понадобится некоторое время, чтобы освоиться со значениями вверх и вниз.
Ниже следует упрощенная версия кода, предложенная Mr.Wizard. Я установил OverBar над каждой повторяющейся цифрой, чтобы разрешить разрыв строки. (Один OverBar над строкой выглядит аккуратнее, но не может сломаться при достижении правого поля экрана.)
ClearAll[repeatingDecimal]
repeatingDecimal[n_Integer | n_Real] := n
Format[repeatingDecimal[q_Rational]] := Row @ Flatten[
{IntegerPart@q, ".", RealDigits@FractionalPart@q} /.
{{nr___Integer, r_List: {}}, pt_} :> {Table[0, {-pt}], nr, OverBar /@ r}
]
repeatingDecimal[q_] + x_ ^:= q + x
repeatingDecimal[q_] * x_ ^:= q * x
repeatingDecimal[q_] ^ x_ ^:= q ^ x
В таблице ниже показан некоторый вывод из repeatingDecimal
:
n1 = 1; n2 = 15; ClearAll[i, k, r];
TableForm[Table[repeatingDecimal[i/j], {i, n1, n2}, {j, n1, n2}],
TableHeadings -> {None, Table[("r")/k, {k, n1, n2}]}]
![enter image description here](https://i.stack.imgur.com/3rPsO.png)
Проверка решения: Работа с повторяющимися десятичными числами
Теперь давайте проверим сложение и умножение повторяющихся десятичных знаков:
a = repeatingDecimal[7/31];
b = repeatingDecimal[24/31];
Print["a = ", a]
Print["b = ", b]
Print["a + b = ", a, " + ", b, " = ", a + b]
Print["7/31 \[Times] 24/31 = " , (7/31)* (24/31)]
Print["a\[Times]b = ", a*b, " = \n", repeatingDecimal[a*b]]
Print[N[168/961, 465]]
![repeating decimal addition and multiplication](https://i.stack.imgur.com/HzlTp.png)
Таким образом, сложение и умножение повторяющихся десятичных знаков работают по желанию. Power
также работает нормально.
Обратите внимание, что 168/961 занимает 465 знаков справа от десятичной точки. После этого он начинает повторяться. Результаты совпадают с N[168/961, 465]
, за исключением OverBar
, хотя разрывы строк происходят в разных местах. И, как и следовало ожидать, это соответствует следующему:
digits = RealDigits[168/961]
Length[digits[[1, 1]]]
![465 digits](https://i.stack.imgur.com/XKaB3.png)
Некоторые эффекты обертки Format [] в поведении N [] при суммировании повторяющихся десятичных знаков
Mr.Wizard предположил, что оболочка Format является излишней для случаев целых чисел и вещественных чисел.
Давайте рассмотрим следующие два дополнения
repeatingDecimal[7/31] + repeatingDecimal[24/31]
N@repeatingDecimal[7/31] + N@repeatingDecimal[24/31]
ведут себя в четырех разных случаях:
Случай 1 : результаты, когда Format
обернуты вокруг повторяющихся десятичных чисел для вещественных чисел и целых чисел, при этом значения ON
![Case 1](https://i.stack.imgur.com/kDebI.png)
Как и ожидалось, первое сложение дает целое число, второе - десятичное.
Случай 2 : Результаты, когда
Format
НЕ обернуты вокруг повторяющихся десятичных чисел для вещественных и целых чисел, но значения up равны
ON
![Case 2](https://i.stack.imgur.com/26dQX.png)
Оболочка Format
для вещественных чисел и целых чисел не влияет на имеющиеся дополнения.
Случай 3 : Результаты, когда
Format
обернут вокруг повторяющихся десятичных чисел для вещественных и целых чисел, но значения up равны
OFF
![Case 3](https://i.stack.imgur.com/xHXBJ.png)
Если значения up выключены, Format
предотвращает добавление.
Случай 4 : Результаты, когда
Format
НЕ обернуты вокруг повторяющихся десятичных чисел для вещественных чисел и целых значений, а значения
OFF
![Case 4](https://i.stack.imgur.com/D5z4d.png)
Если значения повышения ВЫКЛ и Формат` НЕ обернуты вокруг повторяющихся десятичных чисел для вещественных и целых чисел, второе добавление работает, как и ожидалось.
Все больше причин для удаления оболочки формата для случая вещественных чисел и чисел.
У кого-нибудь есть замечания по поводу различных результатов в случаях 3 и 4?