anchor.diff:  
   class operator BigRational.Explicit(const Value: BigRational): Double;
   begin
  -  if Value.FDenom = BigInteger.One then
  -    Result := Value.FNum.AsDouble
  -  else
  -    Result := Value.FNum.AsDouble / Value.FDenom.AsDouble;
  +  if Value.FDenominator = BigInteger.One then
  +    Result := Value.FNumerator.AsDouble
  +  else
  +    Result := Value.FNumerator.AsDouble / Value.FDenominator.AsDouble;
   end;
   
   class operator BigRational.Explicit(const Value: BigRational): Int64;
   begin
  -  if Value.FDenom = BigInteger.One then
  -    Result := Int64(Value.FNum)
  -  else
  -    Result := Int64(Value.FNum div Value.FDenom);
  +  if Value.FDenominator = BigInteger.One then
  +    Result := Int64(Value.FNumerator)
  +  else
  +    Result := Int64(Value.FNumerator div Value.FDenominator);
   end;
   
   function BigRational.GetSign: Integer;
   begin
  -  if FNum.IsZero then
  +  if FNumerator.IsZero then
       Result := 0
  -  else if FNum.IsNegative then
  +  else if FNumerator.IsNegative then
       Result := -1
     else
       Result := 1;
  
positive.code:   Result := Left / Right;
  end;
  
  class procedure BigRational.DivMod(const Left, Right: BigRational; var Quotient, Remainder: BigRational);
  begin
  
  end;
  
  class operator BigRational.Equal(const Left, Right: BigRational): Boolean;
  
negative.code: var
    GCD: BigInteger;
  begin
    if FDenominator.IsZero then
      Error(ecZeroDenominator, []);
  
    if FDenominator = BigInteger.One then
      Exit;
  
    GCD := BigInteger.Abs(BigInteger.GreatestCommonDivisor(FNumerator, FDenominator));
  
    // TODO: See if this can be simplified by shifting common low zero bits away first
    if GCD > BigInteger.One then
    begin
      FNumerator := FNumerator div GCD;
      FDenominator := FDenominator div GCD;
    end;
    if FDenominator.IsNegative then
    begin
      FDenominator := -FDenominator;
      FNumerator := -FNumerator;
    end;
  end;
  
  