 /*
##########################################################################
#                                                                        #
# 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 79 2006-03-29 12:28:52Z sbecuwe $

                                                                     
*/
/**	\file
 * 	\brief	Specific definitions for class DriverFloatRepr of MpIeee basic operations
 */

#include <iostream>
#include <sstream>
#include <cmath>
#include <DriverFloatRepr.h>
#include <MpIeee.hh>
#include <ArithmosIO.hh>

extern void outputHexadecimalRep2(ostream &o,const MpIeee &s) ;

DriverFloatRepr DriverFloatRepr::operator + (DriverFloatRepr& fl) 
{
  
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp); 

  MpIeee res(FPParams(2, sizeMant, sizeExp)), op1(FPParams(2, sizeMant, sizeExp)), op2(FPParams(2, sizeMant, sizeExp));
  
  op1=to();
  op2=fl.to();

	
	/*
	//This is to test sub using add testssets a+b= a-(-b)
	if (op2.getSign()==plus)
	  op2.setSign(minus);
	else 
	  op2.setSign(plus);
	*/

  SetLibRound();
  SetLibEnvironment();
  res = op1 + op2;
  GetLibExceptions();  
  
  DriverFloatRepr r(res);
  return r;
}

DriverFloatRepr DriverFloatRepr::operator - (DriverFloatRepr &fl)
{
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp);
  MpIeee res(FPParams(2, sizeMant, sizeExp)),op1(FPParams(2, sizeMant, sizeExp)),op2(FPParams(2, sizeMant, sizeExp));

  op1=to();
  op2= fl.to();

  SetLibRound();
  SetLibEnvironment();
  res = op1 - op2;
  GetLibExceptions();
    
  DriverFloatRepr r(res);
  return r;
}

DriverFloatRepr DriverFloatRepr::operator * (DriverFloatRepr &fl)
{
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp);
  
  MpIeee res(FPParams(2, sizeMant, sizeExp)), op1(FPParams(2, sizeMant, sizeExp)) ,op2(FPParams(2, sizeMant, sizeExp));

  op1= to();
  op2= fl.to();
  
  SetLibRound();
  SetLibEnvironment();
  res = op1 * op2;
  ArithmosIO::setIOMode( ARITHMOS_IO_MPIEEE_BINREP );
  GetLibExceptions();  
  
  DriverFloatRepr r(res);
  return r;
}

DriverFloatRepr DriverFloatRepr::operator / (DriverFloatRepr &fl) {
  
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp);
  MpIeee res(FPParams(2, sizeMant, sizeExp)), op1(FPParams(2, sizeMant, sizeExp)), op2(FPParams(2, sizeMant, sizeExp));

  op1= to();
  op2= fl.to();

  SetLibRound();
  SetLibEnvironment();
  res = op1 / op2;
  GetLibExceptions();  
  
  DriverFloatRepr r(res);
  return r;
}


DriverFloatRepr DriverFloatRepr::operator % (DriverFloatRepr &fl)
{
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp);
  MpIeee res(FPParams(2, sizeMant, sizeExp)), op1(FPParams(2, sizeMant, sizeExp)),op2(FPParams(2, sizeMant, sizeExp));

  op1= to();
  op2= fl.to();

  SetLibRound();
  SetLibEnvironment();
  res = op1 % op2;
  GetLibExceptions();
    
  DriverFloatRepr r(res);
  return r;
}

DriverFloatRepr DriverFloatRepr::sqrt()
{
  MpIeee::fpEnv.setRadix(2);
  MpIeee::fpEnv.setExponentSize(sizeExp);
  MpIeee res(FPParams(2, sizeMant, sizeExp)), op1(FPParams(2, sizeMant, sizeExp));

  op1= to();
  
  SetLibRound();
  SetLibEnvironment();
  res = ::sqrt(op1);
  GetLibExceptions();  

  DriverFloatRepr r(res);
  return r;
}

