/* Test de precsion sur les double               */
/* Obtention d'une conclusion erronnee           */
/* a un test d'orthogonalite                     */

public class TestPrecisionEnConsole {

///////////////////////////////////////////////////

  /* Test de precsion sur les double             */
  /* Obtention d'une conclusion erronnee         */
  /* a un test d'orthogonalite                   */

  /* Un type agrege de stockage d'une direction  */
  /* dans un espace a trois dimensions           */
  /* a coordonnees reelles                       */

  static class Direction3D {
    double x = 0.0;
    double y = 0.0;
    double z = 0.0; }

  /* Calcul du produit vectoriel                 */
  /* de deux Direction3D                         */

  static Direction3D produitVectoriel(Direction3D d1,Direction3D d2) {
    Direction3D d = new Direction3D();
    d.x = d1.y*d2.z - d1.z*d2.y;
    d.y = d1.z*d2.x - d1.x*d2.z;
    d.z = d1.x*d2.y - d1.y*d2.x;
    return(d);
  }

  /* Calcul du produit scalaire                  */
  /* de deux Direction3D                         */

  static double produitScalaire(Direction3D d1,Direction3D d2) {
    double res = d1.x*d2.x+d1.y*d2.y+d1.z*d2.z;
    return(res);
  }

  /* Test d'orthogonalite entre deux Direction3D */

  static boolean estOrthogonal(Direction3D d1,Direction3D d2) {
    boolean res = ( produitScalaire(d1,d2) == 0.0 );
    return(res);
  }

  /* Affichage ecran d'une Direction3D           */

  static void afficher(Direction3D d) {
    Console.formater("%20.20f\n",d.x);
    Console.formater("%20.20f\n",d.y);
    Console.formater("%20.20f\n",d.z);
  }

  /* Programme principal                         */

  public static void main(String [] args) {
    Console.setTitle("TestPrecision");
    /* Declaration et initialisation             */
    /* de deux Direction3D                       */
    Direction3D d1 = new Direction3D();
    Direction3D d2 = new Direction3D();
    d1.x = 1.1;
    d1.y = 2.1;
    d1.z = 3.3;
    d2.x = 3.7;
    d2.y = 2.6;
    d2.z = 1.3;
    /* Calcul d'une direction orthogonale        */
    /* à d1 et à d2                              */
    Direction3D d3 = produitVectoriel(d1,d2);
    /* Affichage ecran de d1, d2 et d3           */
    Console.afficherln("d1 :");
    afficher(d1);
    Console.afficherln("d2 :");
    afficher(d2);
    Console.afficherln("d3 :");
    afficher(d3);
    Console.sautDeLigne();
    /* Tests d'orthogonalite                     */
    /* entre d1 et d3 et entre d2 et d3          */
    /* et affichage ecran des resultats          */
    Console.afficherln("d1 orthogonal à d3           : ",estOrthogonal(d1,d3));
    Console.afficherln("d2 orthogonal à d3           : ",estOrthogonal(d2,d3));
    /* Affichage ecran des produits scalaires    */
    /* sur lesquels sont bases les tests         */
    /* d'orthogonalite                           */
    Console.formater("Produit scalaire de d1 et d3 : %20.20f\n",produitScalaire(d1,d3));
    Console.formater("Produit scalaire de d2 et d3 : %20.20f\n",produitScalaire(d2,d3));
  }

///////////////////////////////////////////////////
}