 /*
##########################################################################
#                                                                        #
# Program: IeeeCC754                                                     #
#                                                                        #
# Description:                                                           #
#   IeeeCC754 or IEEE 754 Compliance Checker is a precision and range    #
#   independent tool to test whether an implementation of                #
#   floating-point arithmetic (in hardware or software) is compliant     #
#   with the principles of the IEEE 754-854 floating-point standards.    #
#   You can find out more about the testing tool IeeeCC754 at            #
#                                                                        #
#         http://www.win.ua.ac.be/~cant/ieeecc754.html                   #
#                                                                        #
#   This tool is in parts based on and greatly benefited from the        #
#   the program FPTEST developed by Jerome Coonen. For a full            #
#   description of the extensions to FPTEST and a reference to           #
#   the original Coonen program, please refer to the URL given above.    #
#   For the options available with the program IeeeCC754 and its         #
#   compatibility with David Hough's hexadecimal UCB format, we          #
#   also refer to the file readme.usage.                                 #
#                                                                        #
#  Usage: see readme.usage                                               #
#                                                                        #
#  Responsible authors:                                                  #
#         Brigitte Verdonk                                               #
#         Annie Cuyt                                                     #
#                                                                        #
#  Contributors:                                                         #
#         Tarun Agarwal (05-07/2002)                                     #
#         Stefan Becuwe (07/2000- )                                      #
#         Johan Bogo (10/1998-09/1999)                                   #
#         Wim Dausy (10/2002-09/2003)                                    #
#         Tim Gevers (10-12/2000)                                        #
#         Matthias Huesken (02/2004- )                                   #
#         Debby Ooms (10/1996-09/1997)                                   #
#         Geert Vermuyten (10/1996-09/1997)                              #
#         Dennis Verschaeren (09/1996-06/2000)                           #
#                                                                        #
#  Copyright (C) 2000,2001,2002,2003,2004,2005                           #
#                Universiteit Antwerpen                                  #
#                                                                        #
#  This program can be obtained from the authors, free, but WITHOUT ANY  #
#  WARRANTY; without even the implied warranty of MERCHANTABILITY or     #
#  FITNESS FOR A PARTICULAR PURPOSE.                                     #
#                                                                        #
#  Contact:                                                              #
#       Brigitte.Verdonk@ua.ac.be                                        #
#       Departement Wiskunde en Informatica                              #
#       Universiteit Antwerpen                                           #
#       Middelheimlaan 1                                                 #
#       B-2020 Antwerpen, Belgium                                        #
#                                                                        #
##########################################################################


$Id: BasicOptest.cc 65 2005-05-17 12:03:09Z sbecuwe $

                                                                     
 */
/**     \file
 *      \brief  Specific definitions for class DriverFloatRepr of FMLib basic operations
 */
 
// ----
// Includes
// ----
#include <cmath>
#include <DriverFloatRepr.h>
#include <iostream>
#include <string>

// ----
// Defines
// ----

// NDIGMX : MAX PRECISION, DO NOT CHANGE
#define NDIGMX 256 // max value for NDIG IN PACKAGE
#define breedte NDIGMX + 2
#define KWARN 

// function for debugging means
// ---
void printFmNumber(char* text,FmNumber value,int debug=0);

DriverFloatRepr DriverFloatRepr::operator + (DriverFloatRepr &q)
{
  DriverFloatRepr res(sizeMant,sizeExp,hidden);
  
  toDriverFloatRepr(mant,exp,hidden,Sign());
  q.toDriverFloatRepr(q.mant,q.exp,q.hidden,q.Sign());
  
  SetLibRound();
  
  printFmNumber((char *)"Mant Op1", value);
  printFmNumber((char *)"Mant Op2", value);
    
  FMADD(value, q.value, res.value);
  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  return res;
}

DriverFloatRepr DriverFloatRepr::operator - (DriverFloatRepr &q)
{
  DriverFloatRepr res(sizeMant,sizeExp,hidden);
  
  toDriverFloatRepr(mant,exp,hidden,Sign());
  q.toDriverFloatRepr(q.mant,q.exp,q.hidden,q.Sign());
  
  SetLibRound();
  FMSUB(value, q.value, res.value);
  
  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  return res;
}

DriverFloatRepr DriverFloatRepr::operator * (DriverFloatRepr &q)
{
  DriverFloatRepr res(sizeMant,sizeExp,hidden);

  toDriverFloatRepr(mant,exp,hidden,Sign());
  q.toDriverFloatRepr(q.mant,q.exp,q.hidden,q.Sign());

  printFmNumber((char *)"Mant Op1", value);
  printFmNumber((char *)"Mant Op2", q.value);

  SetLibRound();
  FMMPY(value, q.value, res.value);
  
  printFmNumber((char *)"Mant res", res.value);

  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  return res;
}

DriverFloatRepr DriverFloatRepr::operator / (DriverFloatRepr &q)
{
  DriverFloatRepr res(sizeMant,sizeExp,hidden);
  
  toDriverFloatRepr(mant,exp,hidden,Sign());
  q.toDriverFloatRepr(q.mant,q.exp,q.hidden,q.Sign());
  
  SetLibRound();
  FMDIV(value, q.value, res.value);
  
  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  return res;
}

DriverFloatRepr DriverFloatRepr::operator % (DriverFloatRepr &q)
{
  DriverFloatRepr res(sizeMant,sizeExp,hidden);
  
  toDriverFloatRepr(mant,exp,hidden,Sign());
  q.toDriverFloatRepr(q.mant,q.exp,q.hidden,q.Sign());
  
  SetLibRound();
  FMMOD(value, q.value, res.value);
  
  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  return res;
}

DriverFloatRepr DriverFloatRepr::sqrt()
{
  //cout << "Beginning sqrt call" << endl;
  DriverFloatRepr res(sizeMant,sizeExp,hidden);
  toDriverFloatRepr(mant,exp,hidden,Sign());
  
  SetLibRound();
  //printFmNumber((char *)"",value,1);
  FMSQRT(value, res.value);
  //cout << "After sqrt call" << endl;
  //printFmNumber((char *)"",res.value,1);
  res.fromDriverFloatRepr(res.mant,res.exp,res.hidden);
  //cout << "After to driver call" << endl;
  return res;
}

void printFmNumber(char* text,FmNumber value, int debug) {
  if ( debug) {
    cout << text << ": " << endl;
    cout << "Precision: " << value[0]<< endl;
    cout << "Exponent : " << value[1]<< endl;
    cout << value[1] << endl;
    for (int i=2; i<=value[0]+1; i++) {
      cout << value[i];
    }
    
    cout << endl;
  }
}


