⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rational.h

📁 早期freebsd实现
💻 H
字号:
// This may look like C code, but it is really -*- C++ -*-/* Copyright (C) 1988 Free Software Foundation    written by Doug Lea (dl@rocky.oswego.edu)This file is part of the GNU C++ Library.  This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version.  This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE.  See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*/#ifndef _Rational_h#ifdef __GNUG__#pragma interface#endif#define _Rational_h 1#include <Integer.h>#include <math.h>class Rational{protected:  Integer          num;  Integer          den;  void             normalize();public:                   Rational();                   Rational(double);                   Rational(long n);                   Rational(long n, long d);                   Rational(long n, unsigned long d);                   Rational(unsigned long n, long d);                   Rational(unsigned long n, unsigned long d);                   Rational(const Integer& n);                   Rational(const Integer& n, const Integer& d);                   Rational(const Rational&);                  ~Rational();  void             operator =  (const Rational& y);  friend int       operator == (const Rational& x, const Rational& y);  friend int       operator != (const Rational& x, const Rational& y);  friend int       operator <  (const Rational& x, const Rational& y);  friend int       operator <= (const Rational& x, const Rational& y);  friend int       operator >  (const Rational& x, const Rational& y);  friend int       operator >= (const Rational& x, const Rational& y);  friend Rational  operator +  (const Rational& x, const Rational& y);  friend Rational  operator -  (const Rational& x, const Rational& y);  friend Rational  operator *  (const Rational& x, const Rational& y);  friend Rational  operator /  (const Rational& x, const Rational& y);  void             operator += (const Rational& y);  void             operator -= (const Rational& y);  void             operator *= (const Rational& y);  void             operator /= (const Rational& y);#ifdef __GNUG__  friend Rational  operator <? (const Rational& x, const Rational& y); // min  friend Rational  operator >? (const Rational& x, const Rational& y); // max#endif  friend Rational  operator - (const Rational& x);// builtin Rational functions  void             negate();                      // x = -x  void             invert();                      // x = 1/x  friend int       sign(const Rational& x);             // -1, 0, or +1  friend Rational  abs(const Rational& x);              // absolute value  friend Rational  sqr(const Rational& x);              // square  friend Rational  pow(const Rational& x, long y);  friend Rational  pow(const Rational& x, const Integer& y);  const Integer&   numerator() const;  const Integer&   denominator() const;// coercion & conversion                   operator double() const;  friend Integer   floor(const Rational& x);  friend Integer   ceil(const Rational& x);  friend Integer   trunc(const Rational& x);  friend Integer   round(const Rational& x);  friend istream&  operator >> (istream& s, Rational& y);  friend ostream&  operator << (ostream& s, const Rational& y);  int		   fits_in_float() const;  int		   fits_in_double() const;// procedural versions of operators  friend int       compare(const Rational& x, const Rational& y);  friend void      add(const Rational& x, const Rational& y, Rational& dest);  friend void      sub(const Rational& x, const Rational& y, Rational& dest);  friend void      mul(const Rational& x, const Rational& y, Rational& dest);  friend void      div(const Rational& x, const Rational& y, Rational& dest);// error detection  void    error(const char* msg) const;  int              OK() const;};typedef Rational RatTmp; // backwards compatibilityinline Rational::Rational() : num(&_ZeroRep), den(&_OneRep) {}inline Rational::~Rational() {}inline Rational::Rational(const Rational& y) :num(y.num), den(y.den) {}inline Rational::Rational(const Integer& n) :num(n), den(&_OneRep) {}inline Rational::Rational(const Integer& n, const Integer& d) :num(n),den(d){  normalize();}inline Rational::Rational(long n) :num(n), den(&_OneRep) { }inline Rational::Rational(long n, long d) :num(n), den(d){  normalize();}inline Rational::Rational(long n, unsigned long d) :num(n), den(d){  normalize();}inline Rational::Rational(unsigned long n, long d) :num(n), den(d){  normalize();}inline Rational::Rational(unsigned long n, unsigned long d) :num(n), den(d){  normalize();}inline  void Rational::operator =  (const Rational& y){  num = y.num;  den = y.den;}inline int operator == (const Rational& x, const Rational& y){  return compare(x.num, y.num) == 0 && compare(x.den, y.den) == 0;}inline int operator != (const Rational& x, const Rational& y){  return compare(x.num, y.num) != 0 || compare(x.den, y.den) != 0;}inline int operator <  (const Rational& x, const Rational& y){  return compare(x, y) <  0; }inline int operator <= (const Rational& x, const Rational& y){  return compare(x, y) <= 0; }inline int operator >  (const Rational& x, const Rational& y){  return compare(x, y) >  0; }inline int operator >= (const Rational& x, const Rational& y){  return compare(x, y) >= 0; }inline int sign(const Rational& x){  return sign(x.num);}inline void Rational::negate(){  num.negate();}inline void Rational::operator += (const Rational& y) {  add(*this, y, *this);}inline void Rational::operator -= (const Rational& y) {  sub(*this, y, *this);}inline void Rational::operator *= (const Rational& y) {  mul(*this, y, *this);}inline void Rational::operator /= (const Rational& y) {  div(*this, y, *this);}inline const Integer& Rational::numerator() const { return num; }inline const Integer& Rational::denominator() const { return den; }inline Rational::operator double() const { return ratio(num, den); }#ifdef __GNUG__inline Rational operator <? (const Rational& x, const Rational& y){  if (compare(x, y) <= 0) return x; else return y;}inline Rational operator >? (const Rational& x, const Rational& y){  if (compare(x, y) >= 0) return x; else return y;}#endif#if defined(__GNUG__) && !defined(NO_NRV)inline Rational operator + (const Rational& x, const Rational& y) return r{  add(x, y, r);}inline Rational operator - (const Rational& x, const Rational& y) return r{  sub(x, y, r);}inline Rational operator * (const Rational& x, const Rational& y) return r{  mul(x, y, r);}inline Rational operator / (const Rational& x, const Rational& y) return r{  div(x, y, r);}#else /* NO_NRV */inline Rational operator + (const Rational& x, const Rational& y) {  Rational r; add(x, y, r); return r;}inline Rational operator - (const Rational& x, const Rational& y){  Rational r; sub(x, y, r); return r;}inline Rational operator * (const Rational& x, const Rational& y){  Rational r; mul(x, y, r); return r;}inline Rational operator / (const Rational& x, const Rational& y){  Rational r; div(x, y, r); return r;}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -