import java.util.Arrays; public class Fraction { private int a,b; // numérateur,dénominateur (en forme simplifiée) // il serait plus prudent de travailler avec des long ou des BigInteger // ou d'utiliser les méthodes d'addition "safe" décrites à // https://www.securecoding.cert.org/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow /// Constructeurs et création d'instances de fraction Fraction(int a, int b){ if(b==0) throw new IllegalArgumentException("fraction illegale:"+a+"/"+b); this.a=a; this.b=b; simplifier(); } Fraction(int a){ this(a,1); } // analyser chaîne pour y retrouver une fraction public static Fraction parse(String s){ String[] parties = s.split("/"); try{ if(parties.length==1) return new Fraction(new Integer(parties[0])); else if (parties.length==2) return new Fraction(new Integer(parties[0]),new Integer(parties[1])); else throw new IllegalArgumentException("Fraction illegale:"+s); } catch (NumberFormatException e){ throw new IllegalArgumentException("Fraction illegale:"+s); } } // méthodes d'instance @Override public String toString(){ return a+(b==1?"":"/"+b); } public double doubleValue(){ return (double)a/(double)b; } // opérations classiques selon l'implantation naïve... // voir Knuth, Art of Computer Programming, Vol 2, Section 4.5, p 330-332 public Fraction plus(Fraction that){ return new Fraction(a*that.b+that.a*b,b*that.b); } public Fraction minus(Fraction that){ return new Fraction(a*that.b-that.a*b,b*that.b); } public Fraction mult(Fraction that){ return new Fraction(a*that.a,b*that.b); } public Fraction div(Fraction that){ return new Fraction(a*that.b,b*that.a); } // comparaison de fractions @Override public boolean equals(Object o){ if(o==this)return true; if(!(o instanceof Fraction)) return false; Fraction that = (Fraction)o; return a==that.a && b==that.b; } public int compareTo(Fraction that){ int thatA = that.a; int thatB = that.b; if(a<0 && thatA>0) return -1; if(a>0 && thatA<0) return 1; int r1 = Math.abs(a)*thatB; int r2 = Math.abs(thatA)*b; return r1==r2 ? 0 : r1f2="+f1.compareTo(f2)); System.out.println("f2<>f1="+f2.compareTo(f1)); // illustration de l'accumulation d'erreur avec double double inc = 1.0/3.0, sum=0; Fraction incf=new Fraction(1,3), sumf=new Fraction(0); int nb=6; for(int i=0;i<6;i++){ sum=sum+inc; sumf=sumf.plus(incf); } System.out.println(incf+" * "+nb+" => "+sumf+" vs "+sum); // test avec la matrice de Cauchy // attention de n'appeler qu'avec des "petits" nombres car les // résultats intermédiaires peuvent déborder matriceDeCauchy(new int[]{2,4,5,7}, new int[]{3,7,9,4}); } }