有理数定义为两个整数a和b的商,二者分别称为分子和分母,其中b != 0。
注意,从数学上讲,分母不能为零。 然而在许多有理数的实现中,你会发现分母允许为零,其行为类似于浮点数中的正无穷或负无穷。 在这些情况下,分母和分子一般仍然不能同时为零。
有理数r = a/b的绝对值|r|等于|a|/|b|。
两个有理数r₁ = a₁/b₁和r₂ = a₂/b₂的和为r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂)。
两个有理数r₁ = a₁/b₁和r₂ = a₂/b₂的差为r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂)。
两个有理数r₁ = a₁/b₁和r₂ = a₂/b₂的积(乘法)为r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂)。
有理数r₁ = a₁/b₁除以另一个有理数r₂ = a₂/b₂,结果为r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁),前提是a₂不为零。
有理数r = a/b的n次幂(n为非负整数)等于r^n = (a^n)/(b^n)。
有理数r = a/b的n次幂(n为负整数)等于r^n = (b^m)/(a^m),其中m = |n|。
有理数r = a/b的x次幂(x为实数,即浮点数)等于商(a^x)/(b^x),结果是一个实数。
以有理数r = a/b为指数求实数x的幂,等于x^(a/b) = root(x^a, b),其中root(p, q)表示p的q次方根。
实现以下运算:
有理数的实现结果应始终约分到最简形式。
例如,4/4应约分为1/1,30/60应约分为1/2,12/8应约分为3/2,等等。
要约分有理数r = a/b,可将a和b除以a和b的最大公约数(gcd)。
例如,gcd(12, 8) = 4,因此r = 12/8可以约分为(12/4)/(8/4) = 3/2。
有理数约分后的形式应为“标准形式”(分母应始终为正整数)。
如果分母是负整数,就将分子和分母都乘以-1,以确保得到标准形式。
例如,3/-4应约分为-3/4
假设你使用的编程语言没有有理数的实现。
定义一个rat元组,带numerator和denominator槽。
<rat>应把它的参数约分到最简形式,符号放在分子上(因此分母始终为正)。
<rat> ( numerator denominator -- rat ),构造一个已约分的有理数。>rat ( pair -- rat ),从{ numerator denominator }构造一个rat。rat>pair ( rat -- pair ),返回{ numerator denominator }。r+ ( a b -- c )、r- ( a b -- c )、r* ( a b -- c )、
r/ ( a b -- c ),对两个有理数做算术运算。r-abs ( a -- |a| ),求绝对值。r^ ( a n -- a^n ),把有理数升到整数次幂
(允许负指数)。real^r ( x a -- y ),把实数升到有理数指数并返回一个浮点数。Factor 的MATH:泛型(+、-、*、/)只能在内置的数学层次结构上分派,
所以本练习使用专门的单词名,而不是在这些泛型上定义方法。