/*
 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 *  Copyright (C) 2008-2008 - INRIA - Allan SIMON
 *
 *  This file must be used under the terms of the CeCILL.
 *  This source file is licensed as described in the file COPYING, which
 *  you should have received as part of this distribution.  The terms
 *  are also available at
 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 *
 */

#define SIZE 100

#define DMATRIX_TEST {14.6458099031118518,15.9879935334969154,14.5023146230340352,9.79104027026660262,\
 13.658147977601745,18.2826677794023276,13.9913488019182726,13.0555850244756648,\
 11.2702097163264696,12.2080852641231488,\
14.9576657268129818,18.0415870145381838,15.4577532112657572,10.6060207869925502,\
 14.6987916130120198,19.9917861348452170,14.8484467294549827,14.0994958596124,\
 12.1294313366477713,12.8836800651605152,\
7.72729140087719646,8.27571528291814396,8.78222511899259928,5.22537042408334251,\
 7.61718988429527233,10.1106593547443495,7.22727291477849576,6.72646688774223733,\
 6.21430065514425589,6.69442204331610213,\
11.8618893865302528,13.2731189359057637,12.8373872935372706,9.52692469532374631,\
 11.9056327368823247,16.3654355264039921,11.8674243780595265,11.7206072002431814,\
 9.24712051368910970,10.6966525674175159,\
7.25089971320127891,8.98673751651268127,7.49831172728240691,5.29368504368777693,\
 8.12154956830077346,10.3089262075282218,7.4337348502224856,6.83888206810676191,\
 5.87125977419815737,6.5321378683758375,\
9.25854069422946502,10.4059421461299539,9.47515410794143342,7.263789985253827,\
 9.16034813421007321,13.6353552693330933,9.3726649654333336,8.83558176180042132,\
 7.6055387753197277,8.4871270614444292,\
12.6878667266786511,14.1417583108624711,13.0448499416136254,9.182764814582713,\
 12.4852121681423256,17.073953108953809,13.2550267101027224,11.3640159258193041,\
 9.6279844249894015,10.6765282334921068,\
16.0691497196859565,18.4667994666424704,16.975871456346809,12.083598083627443,\
 15.7522021028722747,22.0489520587189212,16.1322911282790358,16.8044904865300744,\
 12.7829232118433556,14.5730443462997599,\
11.943978463537455,13.6259118560125358,11.8068134298221956,8.21687415305816771,\
 11.4127920042158735,15.2296090993128281,11.3826577511842082,11.0976684273648587,\
 10.3857413785092909,10.2894980707345525,\
11.5843985401712821,13.2781579371486753,12.1725305229437293,8.37850128011447204,\
 11.8141382209783163,15.4022074994757734,11.484608766021573,11.1535660239869383,\
 9.31343988645433285,11.1349864749012912}

#define FMATRIX_TEST {4.6052332809216896f,2.16205411267794823f,1.12245312965776556f,4.0468190853821735f,\
 7.29705295628955231f,2.45894799152591625f,2.29331674633863614f,4.21571156291592253f,\
 2.81922686558935887f,2.348781949769843f,\
2.07401297354815162f,1.50063692688995753f,0.25219828236411757f,2.7063265188290884f,\
 6.35812780561968260f,0.67264506810224134f,0.79079814568186024f,2.91747981321864280f,\
 1.01032692983832129f,0.75975015828076931f,\
7.04077899650083694f,5.39363072316827363f,4.99449464719530045f,6.79878933472462954f,\
 11.2977866849707205f,5.7026161792862045f,6.09443833294921244f,7.35970702338152272f,\
 6.14030297304667272f,5.80227288585002476f,\
1.52422494456658053f,0.15792523935350228f,-0.39437456229879331f,3.21063571532312331f,\
 4.72654937095295491f,0.19681048033039794f,0.13926710536989889f,2.4098033377935764f,\
 1.19110231590601412f,0.24431206393184518f,\
5.84910802491279558f,3.67968516288822922f,2.73879619563976862f,5.69547375492497387f,\
 10.2284804678743431f,4.40378197582331143f,3.9855513762320007f,6.24858736599414133f,\
 4.57057059205936156f,4.19331143449899635f,\
2.84423960711997825f,0.91341486330902766f,0.32799575263405639f,3.63130361353437925f,\
 6.73358898182897025f,2.44092642244158631f,1.4035651670524776f,3.29646069585033841f,\
 1.63804041671370615f,1.34065096546340268f,\
5.04689360696997724f,2.58451417966281571f,1.89915292921285772f,4.62170835433455451f,\
 9.05019265678329887f,3.33670002112993291f,3.66038974983755372f,5.62296495186113443f,\
 4.04432332701467434f,3.48415716881126114f,\
2.99051528256943167f,0.76077291642727529f,0.19995186822386554f,2.96972391032047955f,\
 6.60462877127714787f,1.8346028052798535f,1.31621250911818244f,3.73816126628208467f,\
 1.3788533261260996f,0.30973924698106181f,\
5.20595600060592734f,3.44646883779368096f,1.85946748567920750f,5.1361216710529769f,\
 10.0941765681228333f,3.49429925842045552f,3.05021742013193098f,5.4348094549241184f,\
 4.51765668386982977f,3.40850797720926035f,\
4.65702831667450212f,3.03706964016556746f,2.06940591125521856f,5.11047315752830578f,\
 9.94379845012778674f,3.3321507049026704f,3.29919175160893818f,5.94111235727490428f,\
 4.22429837741492253f,4.41612421969640145f}



#include <assert.h>
#include <stdio.h>
#include "frexp.h"
#include "pow.h"


static void dfrexpsTest ( void ) {

    int i = 0 ;

    double out = 0 ;
    double dexp = 0 ;
    double result = 0;



    double in[] = DMATRIX_TEST ;






    for ( i = 0 ; i < SIZE; i++ )
        {
         out  = dfrexps ( in[i] , &dexp   ) ;
         result = out * dpows( 2 , dexp) ;

         printf ( "\t\t %d in :%e %e\tresult : %e\tassert : %e \n" , i , dexp, in[i] , result , fabs( in[i] - result) / fabs( in[i]) ) ;
		 assert ( fabs ( in[i] - result) / fabs( in[i]) < 3e-16 ) ;
        }


}

static void sfrexpsTest ( void ) {

    int i = 0 ;

    float out = 0 ;
    float fexp = 0 ;
    float result = 0;


    float in[] = FMATRIX_TEST ;






    for ( i = 0 ; i < SIZE; i++ )
        {
         out  = sfrexps ( in[i] , &fexp   ) ;
         result = out * spows( 2.0f , fexp) ;

         printf ( "\t\t %d in : %e\tresult : %e\tassert : %e \n" , i , in[i] , result , fabs( in[i] - result) / fabs( in[i]) ) ;
		 assert ( fabs ( in[i] - result) / fabs( in[i]) < 1e-6 ) ;
        }


}


static int testFrexp(void) {

  printf("\n>>>> Matrix Exponential Tests\n");
  printf("\t>>>> Matrix Double Realt Tests\n");
  dfrexpsTest();

  printf("\n\n\t>>>> Matrix Float Realt Tests\n");
  sfrexpsTest();

  return 0;
}



int main(void) {
  assert(testFrexp() == 0);
  return 0;
}