我阅读this great question关于显示和对它们进行简单算术,但我想知道这个(或者只是从头开始),如何显示,然后进一步类似地在给出不同的基础时对它们进行算术运算?
例如,
(1/3)_2=0.01
表示二进制形式的分数1/3
重复二进制数字01
。
谢谢。
答案 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]
修改强>
最新的改进(再次归功于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
答案 1 :(得分:1)
简单:BaseForm[1./12, 3]
将在基数3中显示1/12(1之后的小数点以确保近似)作为重复小数。
额外:将基础x转换为基数10甚至更简单x^^<NUMBER>
答案 2 :(得分:0)