// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
//                         marc.chevaldonne.free.fr
//
// Module        : Program.cs
// Author        : Marc Chevaldonné
// Creation date : 2016-09-22
//
// ========================================================================

using System;
using static System.Console;

namespace ex_004_002_Math
{
    class Program
    {
        static void Main(string[] args)
        {
            OutputEncoding = System.Text.Encoding.UTF8;

            //constantes de la classe Math :
            WriteLine($"CONSTANTES DE LA CLASSE MATH");
            //epsilon
            WriteLine($"E(e) : {Math.E}");
            //PI
            WriteLine($"Pi : {Math.PI}");

            WriteLine();

            //méthodes pour arrondir
            WriteLine($"METHODES POUR ARRONDIR");
            //arrondir 
            WriteLine($"Arrondir 1,9876 à 2 chiffres après la virgule : {Math.Round(1.9876, 2)}");
            //tronquer
            WriteLine($"Partie entière de 1,9876 : {Math.Truncate(1.9876)}");
            //plus grand entier inférieur
            WriteLine($"Plus grand entier inférieur de 1,9876 : {Math.Floor(1.9876)}");
            //plus petit entier supérieur
            WriteLine($"Plus petit entier supérieur de 1,9876 : {Math.Ceiling(1.9876)}");

            WriteLine();

            //calcul de maximums et minimums
            WriteLine($"maximum entre 6 et 4 : {Math.Max(6, 4)}");
            WriteLine($"minimum entre 6 et 4 : {Math.Min(6, 4)}");
            WriteLine($"maximum entre 6, 4 et 5 : {Math.Max(Math.Max(6, 4), 5)}"); //on peut faire mieux avec LINQ et les collections

            WriteLine();

            //signes et valeurs absolues
            WriteLine($"valeur absolue de -4,567 : {Math.Abs(-4.567)}");
            WriteLine($"signe de -4.567 : {Math.Sign(-4.567)}");

            WriteLine();

            //racines carrées, puissances, exponentielles et logarithmes
            WriteLine($"Racine carrée de 625 : {Math.Sqrt(625)}");
            WriteLine($"8 à la puissance 3 : {Math.Pow(8, 3)}");
            WriteLine($"exponentielle de 1 (Exp(1)) : {Math.Exp(1)}");
            WriteLine($"logarithme népérien de e (ln(e)) : {Math.Log(Math.E)}");
            WriteLine($"logarithme décimal de 10 (log(10)) : {Math.Log10(10)}");

            WriteLine();

            //trigonométrie
            WriteLine($"sin(pi/2) : {Math.Sin(Math.PI / 2)}");
            WriteLine($"cos(pi/2) : {Math.Cos(Math.PI / 2)}");
            WriteLine($"tan(pi/2) : {Math.Tan(Math.PI / 2)}");
            //il existe aussi : le sinus hyperbolique (Sinh), le cosinus hyperbolique (Cosh), la tangente hyperbolique (Tanh)
            //                  arcsinus (Asin), arccosinus (Acos) et arctan (Atan)

            WriteLine();

            //autres exemples :
            WriteLine($"exp(e) = {Math.Exp(Math.E)}");
            WriteLine($"ln(exp(1)) = {Math.Log(Math.Exp(1))}");
            WriteLine($"sqrt(|cos(1)|) = {Math.Sqrt(Math.Abs(Math.Cos(1)))}");

            WriteLine();

            //L'assemblage System.Numerics.dll introduit également deux nouvelles classes :
            // BigInteger : un très grand entier sans perte de précision
            // Complex : une structure représentant un nombre complexe
            System.Numerics.BigInteger carlos = System.Numerics.BigInteger.Pow(2, 200);
            WriteLine($"2 à la puissance 200 :\n{carlos}");

            System.Numerics.Complex complex = new System.Numerics.Complex(2, 3);
            System.Numerics.Complex complex2 = new System.Numerics.Complex(-5, 2);
            WriteLine($"Partie réelle de complex : {complex.Real} / partie imaginaire de complex : {complex.Imaginary}");
            //les opérateurs sont réécrits pour les nombres complexes
            System.Numerics.Complex complex3 = complex + complex2;
            WriteLine($"(2 + 3i) + (-5 + 2i) = ({complex3.Real} + {complex3.Imaginary}i)");
            complex3 = System.Numerics.Complex.Conjugate(complex);
            WriteLine($"conjugué de (2 + 3i) = ({complex3.Real} + {complex3.Imaginary}i)");
        }
    }
}
