如何在mathematica中的不同基数中显示重复小数

时间:2011-12-02 21:46:39

标签: wolfram-mathematica

我阅读this great question关于显示和对它们进行简单算术,但我想知道这个(或者只是从头开始),如何显示,然后进一步类似地在给出不同的基础时对它们进行算术运算?

例如,

(1/3)_2=0.01表示二进制形式的分数1/3重复二进制数字01

谢谢。

3 个答案:

答案 0 :(得分:4)

这是一次尝试。瓦格德先生做了很多繁重的工作,特别是在基础保留算术中。

rd[n_] := rd[n, 10]
rd[rd[n_, _], b_] := rd[n, b]

Format[rd[n_Integer | n_Real, base_]] := BaseForm[n, base]

Format[rd[q_Rational, base_]] :=
  Subscript[Row @ Flatten[{
     IntegerString[IntegerPart@q, base], ".",
     RealDigits[FractionalPart@q, base] /.
      {{nr___, r_List:{}}, pt_} :> {0~Table~{-pt}, nr, OverBar /@ r}
   }], base /. 10 -> ""]

可以使用以下方法实现基本保留算法:

Scan[
  (#[rd[q1_, b1_], rd[q2_, b2_] | tail___] ^:=
     rd[ #[q1, q2, tail], If[b1 === b2, b1, 10] ]) &,
  {Plus, Times, Power}
]

检查多个基数中的重复小数转换是否有效。还要检查添加,乘法和除法的例程:

Grid[{{"n", "value", "decimal", "rd[n,10]", "rd[n,2]", "rd[n,3]",  "rd[n,7]"}, 
 {"a", a = 14/3, N[a], rd[a, 10], rd[a, 2], rd[a, 3],  rd[a, 7]}, 
 {"b", b = 2/5, N[b], rd[b, 10], rd[b, 2], rd[b, 3], rd[b, 7]}, 
 {"c", c = 1/2, N[c], rd[c, 10], rd[c, 2], rd[c, 3], rd[c, 7]}, 
 {"a + b", a + b, N[a + b], rd[a, 10] + rd[b, 10], 
    rd[a, 2] + rd[b, 2], rd[a, 3] + rd[b, 3], rd[a, 7] + rd[b, 7]}, 
 {"a + b + c", a + b + c, N[a + b + c], 
   rd[a, 10] + rd[b, 10] + rd[c, 10], rd[a, 2] + rd[b, 2] + rd[c, 2], 
   rd[a, 3] + rd[b, 3] + rd[c, 3], 
   rd[a, 7] + rd[b, 7] + rd[c, 7]}, 
 {"a \[Times] b ", a*b, N[a*b], 
    rd[a, 10]*rd[b, 10], rd[a, 2]*rd[b, 2], rd[a, 3]*rd[b, 3], 
    rd[a, 7]*rd[b, 7]}, {"a \[Times] b \[Times] c ", a*b*c, N[a*b*c], 
    rd[a, 10]*rd[b, 10]*rd[c, 10], rd[a, 2]*rd[b, 2]*rd[c, 2], 
    rd[a, 3]*rd[b, 3]*rd[c, 3], rd[a, 7]*rd[b, 7]*rd[c, 7]}, 
 {"a / b", 
    a/b, N[a/b], rd[a, 10]/rd[b, 10], rd[a, 2]/rd[b, 2], 
    rd[a, 3]/rd[b, 3], rd[a, 7]/rd[b, 7]}}, Dividers -> All]

summary table


修改

最新的改进(再次归功于Mr.Wizard)支持嵌套:

ClearAll[f, x, y]
f := (x/(x + 3 + 2 y) + y)/7 x; f
f // FullForm
x = 14/3; y = 1/3; f
BaseForm[N[f], 10]
x = rd[14/3, 10]; y = rd[1/3, 10]; f
x = rd[14/3, 2]; y = rd[1/3, 2]; f
x = rd[14/3, 5]; y = rd[1/3, 5]; f

nesting

答案 1 :(得分:1)

简单:BaseForm[1./12, 3]将在基数3中显示1/12(1之后的小数点以确保近似)作为重复小数。

额外:将基础x转换为基数10甚至更​​简单x^^<NUMBER>

答案 2 :(得分:0)

'RealDigits'能够处理各种基础,例如

RealDigits[1/3, 2]

{{{1, 0}}, -1}

有关您可能获得的精确输出格式,请参阅documentation。它可能相当复杂。