112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_fxval.cpp -
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Martin Janssen, Synopsys, Inc.
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de *****************************************************************************/
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de/*****************************************************************************
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3112027Sjungma@eit.uni-kl.de  changes you are making here.
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
3412027Sjungma@eit.uni-kl.de  Description of Modification:
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de *****************************************************************************/
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de
3912027Sjungma@eit.uni-kl.de// $Log: sc_fxval.cpp,v $
4012027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:04  acg
4112027Sjungma@eit.uni-kl.de// SystemC 2.3
4212027Sjungma@eit.uni-kl.de//
4312027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:53:58  acg
4412027Sjungma@eit.uni-kl.de// Andy Goodrich: added $Log command so that CVS comments are reproduced in
4512027Sjungma@eit.uni-kl.de// the source.
4612027Sjungma@eit.uni-kl.de//
4712027Sjungma@eit.uni-kl.de
4812027Sjungma@eit.uni-kl.de#include <ctype.h>
4912027Sjungma@eit.uni-kl.de#include <stdlib.h>
5012027Sjungma@eit.uni-kl.de#include <math.h>
5112027Sjungma@eit.uni-kl.de#include <float.h>
5212027Sjungma@eit.uni-kl.de
5312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/sc_fxval.h"
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de
5612027Sjungma@eit.uni-kl.denamespace sc_dt
5712027Sjungma@eit.uni-kl.de{
5812027Sjungma@eit.uni-kl.de
5912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
6012027Sjungma@eit.uni-kl.de//  CLASS : sc_fxval
6112027Sjungma@eit.uni-kl.de//
6212027Sjungma@eit.uni-kl.de//  Fixed-point value type; arbitrary precision.
6312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
6412027Sjungma@eit.uni-kl.de
6512027Sjungma@eit.uni-kl.de// explicit conversion to character string
6612027Sjungma@eit.uni-kl.de
6712027Sjungma@eit.uni-kl.deconst std::string
6812027Sjungma@eit.uni-kl.desc_fxval::to_string() const
6912027Sjungma@eit.uni-kl.de{
7012027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, SC_E ) );
7112027Sjungma@eit.uni-kl.de}
7212027Sjungma@eit.uni-kl.de
7312027Sjungma@eit.uni-kl.deconst std::string
7412027Sjungma@eit.uni-kl.desc_fxval::to_string( sc_numrep numrep ) const
7512027Sjungma@eit.uni-kl.de{
7612027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, -1, SC_E ) );
7712027Sjungma@eit.uni-kl.de}
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.deconst std::string
8012027Sjungma@eit.uni-kl.desc_fxval::to_string( sc_numrep numrep, bool w_prefix ) const
8112027Sjungma@eit.uni-kl.de{
8212027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, (w_prefix ? 1 : 0), SC_E ) );
8312027Sjungma@eit.uni-kl.de}
8412027Sjungma@eit.uni-kl.de
8512027Sjungma@eit.uni-kl.deconst std::string
8612027Sjungma@eit.uni-kl.desc_fxval::to_string( sc_fmt fmt ) const
8712027Sjungma@eit.uni-kl.de{
8812027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, fmt ) );
8912027Sjungma@eit.uni-kl.de}
9012027Sjungma@eit.uni-kl.de
9112027Sjungma@eit.uni-kl.deconst std::string
9212027Sjungma@eit.uni-kl.desc_fxval::to_string( sc_numrep numrep, sc_fmt fmt ) const
9312027Sjungma@eit.uni-kl.de{
9412027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, -1, fmt ) );
9512027Sjungma@eit.uni-kl.de}
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.deconst std::string
9812027Sjungma@eit.uni-kl.desc_fxval::to_string( sc_numrep numrep, bool w_prefix, sc_fmt fmt ) const
9912027Sjungma@eit.uni-kl.de{
10012027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( numrep, (w_prefix ? 1 : 0), fmt ) );
10112027Sjungma@eit.uni-kl.de}
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de
10412027Sjungma@eit.uni-kl.deconst std::string
10512027Sjungma@eit.uni-kl.desc_fxval::to_dec() const
10612027Sjungma@eit.uni-kl.de{
10712027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_DEC, -1, SC_E ) );
10812027Sjungma@eit.uni-kl.de}
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.deconst std::string
11112027Sjungma@eit.uni-kl.desc_fxval::to_bin() const
11212027Sjungma@eit.uni-kl.de{
11312027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_BIN, -1, SC_E ) );
11412027Sjungma@eit.uni-kl.de}
11512027Sjungma@eit.uni-kl.de
11612027Sjungma@eit.uni-kl.deconst std::string
11712027Sjungma@eit.uni-kl.desc_fxval::to_oct() const
11812027Sjungma@eit.uni-kl.de{
11912027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_OCT, -1, SC_E ) );
12012027Sjungma@eit.uni-kl.de}
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.deconst std::string
12312027Sjungma@eit.uni-kl.desc_fxval::to_hex() const
12412027Sjungma@eit.uni-kl.de{
12512027Sjungma@eit.uni-kl.de    return std::string( m_rep->to_string( SC_HEX, -1, SC_E ) );
12612027Sjungma@eit.uni-kl.de}
12712027Sjungma@eit.uni-kl.de
12812027Sjungma@eit.uni-kl.de
12912027Sjungma@eit.uni-kl.de// print or dump content
13012027Sjungma@eit.uni-kl.de
13112027Sjungma@eit.uni-kl.devoid
13212027Sjungma@eit.uni-kl.desc_fxval::print( ::std::ostream& os ) const
13312027Sjungma@eit.uni-kl.de{
13412027Sjungma@eit.uni-kl.de    m_rep->print( os );
13512027Sjungma@eit.uni-kl.de}
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.devoid
13812027Sjungma@eit.uni-kl.desc_fxval::scan( ::std::istream& is )
13912027Sjungma@eit.uni-kl.de{
14012027Sjungma@eit.uni-kl.de    std::string s;
14112027Sjungma@eit.uni-kl.de    is >> s;
14212027Sjungma@eit.uni-kl.de    *this = s.c_str();
14312027Sjungma@eit.uni-kl.de}
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.devoid
14612027Sjungma@eit.uni-kl.desc_fxval::dump( ::std::ostream& os ) const
14712027Sjungma@eit.uni-kl.de{
14812027Sjungma@eit.uni-kl.de    os << "sc_fxval" << ::std::endl;
14912027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
15012027Sjungma@eit.uni-kl.de    os << "rep = ";
15112027Sjungma@eit.uni-kl.de    m_rep->dump( os );
15212027Sjungma@eit.uni-kl.de    // TO BE COMPLETED
15312027Sjungma@eit.uni-kl.de    // os << "r_flag   = " << m_r_flag << ::std::endl;
15412027Sjungma@eit.uni-kl.de    // os << "observer = ";
15512027Sjungma@eit.uni-kl.de    // if( m_observer != 0 )
15612027Sjungma@eit.uni-kl.de    //     m_observer->dump( os );
15712027Sjungma@eit.uni-kl.de    // else
15812027Sjungma@eit.uni-kl.de    //     os << "0" << ::std::endl;
15912027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
16012027Sjungma@eit.uni-kl.de}
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.de
16312027Sjungma@eit.uni-kl.de// protected methods and friend functions
16412027Sjungma@eit.uni-kl.de
16512027Sjungma@eit.uni-kl.desc_fxval_observer*
16612027Sjungma@eit.uni-kl.desc_fxval::lock_observer() const
16712027Sjungma@eit.uni-kl.de{
16812027Sjungma@eit.uni-kl.de    SC_ASSERT_( m_observer != 0, "lock observer failed" );
16912027Sjungma@eit.uni-kl.de    sc_fxval_observer* tmp = m_observer;
17012027Sjungma@eit.uni-kl.de    m_observer = 0;
17112027Sjungma@eit.uni-kl.de    return tmp;
17212027Sjungma@eit.uni-kl.de}
17312027Sjungma@eit.uni-kl.de
17412027Sjungma@eit.uni-kl.devoid
17512027Sjungma@eit.uni-kl.desc_fxval::unlock_observer( sc_fxval_observer* observer_ ) const
17612027Sjungma@eit.uni-kl.de{
17712027Sjungma@eit.uni-kl.de    SC_ASSERT_( observer_ != 0, "unlock observer failed" );
17812027Sjungma@eit.uni-kl.de    m_observer = observer_;
17912027Sjungma@eit.uni-kl.de}
18012027Sjungma@eit.uni-kl.de
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
18312027Sjungma@eit.uni-kl.de//  CLASS : sc_fxval_fast
18412027Sjungma@eit.uni-kl.de//
18512027Sjungma@eit.uni-kl.de//  Fixed-point value types; limited precision.
18612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
18712027Sjungma@eit.uni-kl.de
18812027Sjungma@eit.uni-kl.destatic
18912027Sjungma@eit.uni-kl.devoid
19012027Sjungma@eit.uni-kl.deprint_dec( scfx_string& s, scfx_ieee_double id, int w_prefix, sc_fmt fmt )
19112027Sjungma@eit.uni-kl.de{
19212027Sjungma@eit.uni-kl.de    if( id.negative() != 0 )
19312027Sjungma@eit.uni-kl.de    {
19412027Sjungma@eit.uni-kl.de	id.negative( 0 );
19512027Sjungma@eit.uni-kl.de	s += '-';
19612027Sjungma@eit.uni-kl.de    }
19712027Sjungma@eit.uni-kl.de
19812027Sjungma@eit.uni-kl.de    if( w_prefix == 1 ) {
19912027Sjungma@eit.uni-kl.de	scfx_print_prefix( s, SC_DEC );
20012027Sjungma@eit.uni-kl.de    }
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.de    if( id.is_zero() )
20312027Sjungma@eit.uni-kl.de    {
20412027Sjungma@eit.uni-kl.de	s += '0';
20512027Sjungma@eit.uni-kl.de	return;
20612027Sjungma@eit.uni-kl.de    }
20712027Sjungma@eit.uni-kl.de
20812027Sjungma@eit.uni-kl.de    // split 'id' into its integer and fractional part
20912027Sjungma@eit.uni-kl.de
21012027Sjungma@eit.uni-kl.de    double int_part;
21112027Sjungma@eit.uni-kl.de    double frac_part = modf( static_cast<double>( id ), &int_part );
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    int i;
21412027Sjungma@eit.uni-kl.de
21512027Sjungma@eit.uni-kl.de    // print integer part
21612027Sjungma@eit.uni-kl.de
21712027Sjungma@eit.uni-kl.de    int int_digits = 0;
21812027Sjungma@eit.uni-kl.de    int int_zeros  = 0;
21912027Sjungma@eit.uni-kl.de
22012027Sjungma@eit.uni-kl.de    if( int_part != 0.0 )
22112027Sjungma@eit.uni-kl.de    {
22212027Sjungma@eit.uni-kl.de	int_digits = (int) ceil( log10( int_part + 1.0 ) );
22312027Sjungma@eit.uni-kl.de
22412027Sjungma@eit.uni-kl.de	int len = s.length();
22512027Sjungma@eit.uni-kl.de	s.append( int_digits );
22612027Sjungma@eit.uni-kl.de
22712027Sjungma@eit.uni-kl.de	bool zero_digits = ( frac_part == 0.0 && fmt != SC_F );
22812027Sjungma@eit.uni-kl.de
22912027Sjungma@eit.uni-kl.de	for( i = int_digits + len - 1; i >= len; i-- )
23012027Sjungma@eit.uni-kl.de	{
23112027Sjungma@eit.uni-kl.de	    unsigned int remainder = (unsigned int) fmod( int_part, 10.0 );
23212027Sjungma@eit.uni-kl.de	    s[i] = static_cast<char>( '0' + remainder );
23312027Sjungma@eit.uni-kl.de
23412027Sjungma@eit.uni-kl.de	    if( zero_digits )
23512027Sjungma@eit.uni-kl.de	    {
23612027Sjungma@eit.uni-kl.de		if( remainder == 0 )
23712027Sjungma@eit.uni-kl.de		    int_zeros ++;
23812027Sjungma@eit.uni-kl.de		else
23912027Sjungma@eit.uni-kl.de		    zero_digits = false;
24012027Sjungma@eit.uni-kl.de	    }
24112027Sjungma@eit.uni-kl.de
24212027Sjungma@eit.uni-kl.de	    int_part /= 10.0;
24312027Sjungma@eit.uni-kl.de	}
24412027Sjungma@eit.uni-kl.de
24512027Sjungma@eit.uni-kl.de	// discard trailing zeros from int_part
24612027Sjungma@eit.uni-kl.de	s.discard( int_zeros );
24712027Sjungma@eit.uni-kl.de
24812027Sjungma@eit.uni-kl.de	if( s[len] == '0' )
24912027Sjungma@eit.uni-kl.de	{
25012027Sjungma@eit.uni-kl.de	    // int_digits was overestimated by one
25112027Sjungma@eit.uni-kl.de	    s.remove( len );
25212027Sjungma@eit.uni-kl.de	    -- int_digits;
25312027Sjungma@eit.uni-kl.de	}
25412027Sjungma@eit.uni-kl.de    }
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de    // print fractional part
25712027Sjungma@eit.uni-kl.de
25812027Sjungma@eit.uni-kl.de    int frac_digits = 0;
25912027Sjungma@eit.uni-kl.de    int frac_zeros  = 0;
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de    if( frac_part != 0.0 )
26212027Sjungma@eit.uni-kl.de    {
26312027Sjungma@eit.uni-kl.de	s += '.';
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de	bool zero_digits = ( int_digits == 0 && fmt != SC_F );
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.de	frac_zeros = (int) floor( - log10( frac_part + DBL_EPSILON ) );
26812027Sjungma@eit.uni-kl.de
26912027Sjungma@eit.uni-kl.de	frac_part *= pow( 10.0, frac_zeros );
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.de	frac_digits = frac_zeros;
27212027Sjungma@eit.uni-kl.de	if( ! zero_digits )
27312027Sjungma@eit.uni-kl.de	{
27412027Sjungma@eit.uni-kl.de	    for( i = 0; i < frac_zeros; i ++ )
27512027Sjungma@eit.uni-kl.de		s += '0';
27612027Sjungma@eit.uni-kl.de	    frac_zeros = 0;
27712027Sjungma@eit.uni-kl.de	}
27812027Sjungma@eit.uni-kl.de
27912027Sjungma@eit.uni-kl.de	while( frac_part != 0.0 )
28012027Sjungma@eit.uni-kl.de	{
28112027Sjungma@eit.uni-kl.de	    frac_part *= 10.0;
28212027Sjungma@eit.uni-kl.de	    int n = static_cast<int>( frac_part );
28312027Sjungma@eit.uni-kl.de
28412027Sjungma@eit.uni-kl.de	    if( zero_digits )
28512027Sjungma@eit.uni-kl.de	    {
28612027Sjungma@eit.uni-kl.de		if( n == 0 )
28712027Sjungma@eit.uni-kl.de		    frac_zeros ++;
28812027Sjungma@eit.uni-kl.de		else
28912027Sjungma@eit.uni-kl.de		    zero_digits = false;
29012027Sjungma@eit.uni-kl.de	    }
29112027Sjungma@eit.uni-kl.de
29212027Sjungma@eit.uni-kl.de	    if( ! zero_digits )
29312027Sjungma@eit.uni-kl.de		s += static_cast<char>( '0' + n );
29412027Sjungma@eit.uni-kl.de
29512027Sjungma@eit.uni-kl.de	    frac_part -= n;
29612027Sjungma@eit.uni-kl.de	    frac_digits ++;
29712027Sjungma@eit.uni-kl.de	}
29812027Sjungma@eit.uni-kl.de    }
29912027Sjungma@eit.uni-kl.de
30012027Sjungma@eit.uni-kl.de    // print exponent
30112027Sjungma@eit.uni-kl.de
30212027Sjungma@eit.uni-kl.de    if( fmt != SC_F )
30312027Sjungma@eit.uni-kl.de    {
30412027Sjungma@eit.uni-kl.de        if( frac_digits == 0 )
30512027Sjungma@eit.uni-kl.de	    scfx_print_exp( s, int_zeros );
30612027Sjungma@eit.uni-kl.de	else if( int_digits == 0 )
30712027Sjungma@eit.uni-kl.de	    scfx_print_exp( s, - frac_zeros );
30812027Sjungma@eit.uni-kl.de    }
30912027Sjungma@eit.uni-kl.de}
31012027Sjungma@eit.uni-kl.de
31112027Sjungma@eit.uni-kl.de
31212027Sjungma@eit.uni-kl.destatic
31312027Sjungma@eit.uni-kl.devoid
31412027Sjungma@eit.uni-kl.deprint_other( scfx_string& s, const scfx_ieee_double& id, sc_numrep numrep,
31512027Sjungma@eit.uni-kl.de	     int w_prefix, sc_fmt fmt, const scfx_params* params )
31612027Sjungma@eit.uni-kl.de{
31712027Sjungma@eit.uni-kl.de    scfx_ieee_double id2 = id;
31812027Sjungma@eit.uni-kl.de
31912027Sjungma@eit.uni-kl.de    sc_numrep numrep2 = numrep;
32012027Sjungma@eit.uni-kl.de
32112027Sjungma@eit.uni-kl.de    bool numrep_is_sm = ( numrep == SC_BIN_SM ||
32212027Sjungma@eit.uni-kl.de			  numrep == SC_OCT_SM ||
32312027Sjungma@eit.uni-kl.de			  numrep == SC_HEX_SM );
32412027Sjungma@eit.uni-kl.de
32512027Sjungma@eit.uni-kl.de    if( numrep_is_sm )
32612027Sjungma@eit.uni-kl.de    {
32712027Sjungma@eit.uni-kl.de	if( id2.negative() != 0 )
32812027Sjungma@eit.uni-kl.de	{
32912027Sjungma@eit.uni-kl.de	    s += '-';
33012027Sjungma@eit.uni-kl.de	    id2.negative( 0 );
33112027Sjungma@eit.uni-kl.de	}
33212027Sjungma@eit.uni-kl.de	switch( numrep )
33312027Sjungma@eit.uni-kl.de	{
33412027Sjungma@eit.uni-kl.de	    case SC_BIN_SM:
33512027Sjungma@eit.uni-kl.de		numrep2 = SC_BIN_US;
33612027Sjungma@eit.uni-kl.de		break;
33712027Sjungma@eit.uni-kl.de	    case SC_OCT_SM:
33812027Sjungma@eit.uni-kl.de		numrep2 = SC_OCT_US;
33912027Sjungma@eit.uni-kl.de		break;
34012027Sjungma@eit.uni-kl.de	    case SC_HEX_SM:
34112027Sjungma@eit.uni-kl.de		numrep2 = SC_HEX_US;
34212027Sjungma@eit.uni-kl.de		break;
34312027Sjungma@eit.uni-kl.de	    default:
34412027Sjungma@eit.uni-kl.de		;
34512027Sjungma@eit.uni-kl.de	}
34612027Sjungma@eit.uni-kl.de    }
34712027Sjungma@eit.uni-kl.de
34812027Sjungma@eit.uni-kl.de    if( w_prefix != 0 ) {
34912027Sjungma@eit.uni-kl.de	scfx_print_prefix( s, numrep );
35012027Sjungma@eit.uni-kl.de    }
35112027Sjungma@eit.uni-kl.de
35212027Sjungma@eit.uni-kl.de    numrep = numrep2;
35312027Sjungma@eit.uni-kl.de
35412027Sjungma@eit.uni-kl.de    sc_fxval_fast a( id2 );
35512027Sjungma@eit.uni-kl.de
35612027Sjungma@eit.uni-kl.de    int msb, lsb;
35712027Sjungma@eit.uni-kl.de
35812027Sjungma@eit.uni-kl.de    if( params != 0 )
35912027Sjungma@eit.uni-kl.de    {
36012027Sjungma@eit.uni-kl.de	msb = params->iwl() - 1;
36112027Sjungma@eit.uni-kl.de	lsb = params->iwl() - params->wl();
36212027Sjungma@eit.uni-kl.de
36312027Sjungma@eit.uni-kl.de	if( params->enc() == SC_TC_ &&
36412027Sjungma@eit.uni-kl.de	    ( numrep == SC_BIN_US ||
36512027Sjungma@eit.uni-kl.de	      numrep == SC_OCT_US ||
36612027Sjungma@eit.uni-kl.de	      numrep == SC_HEX_US ) &&
36712027Sjungma@eit.uni-kl.de	    ! numrep_is_sm &&
36812027Sjungma@eit.uni-kl.de	    params->wl() > 1 )
36912027Sjungma@eit.uni-kl.de	    -- msb;
37012027Sjungma@eit.uni-kl.de	else if( params->enc() == SC_US_ &&
37112027Sjungma@eit.uni-kl.de	    ( numrep == SC_BIN ||
37212027Sjungma@eit.uni-kl.de	      numrep == SC_OCT ||
37312027Sjungma@eit.uni-kl.de	      numrep == SC_HEX ||
37412027Sjungma@eit.uni-kl.de	      numrep == SC_CSD ) )
37512027Sjungma@eit.uni-kl.de	    ++ msb;
37612027Sjungma@eit.uni-kl.de    }
37712027Sjungma@eit.uni-kl.de    else
37812027Sjungma@eit.uni-kl.de    {
37912027Sjungma@eit.uni-kl.de	if( a.is_zero() )
38012027Sjungma@eit.uni-kl.de	{
38112027Sjungma@eit.uni-kl.de	    msb = 0;
38212027Sjungma@eit.uni-kl.de	    lsb = 0;
38312027Sjungma@eit.uni-kl.de	}
38412027Sjungma@eit.uni-kl.de	else
38512027Sjungma@eit.uni-kl.de	{
38612027Sjungma@eit.uni-kl.de	    msb = id2.exponent() + 1;
38712027Sjungma@eit.uni-kl.de	    while( a.get_bit( msb ) == a.get_bit( msb - 1 ) )
38812027Sjungma@eit.uni-kl.de		-- msb;
38912027Sjungma@eit.uni-kl.de
39012027Sjungma@eit.uni-kl.de	    if( numrep == SC_BIN_US ||
39112027Sjungma@eit.uni-kl.de		numrep == SC_OCT_US ||
39212027Sjungma@eit.uni-kl.de		numrep == SC_HEX_US )
39312027Sjungma@eit.uni-kl.de		-- msb;
39412027Sjungma@eit.uni-kl.de
39512027Sjungma@eit.uni-kl.de	    lsb = id2.exponent() - 52;
39612027Sjungma@eit.uni-kl.de	    while( ! a.get_bit( lsb ) )
39712027Sjungma@eit.uni-kl.de		++ lsb;
39812027Sjungma@eit.uni-kl.de	}
39912027Sjungma@eit.uni-kl.de    }
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de    int step;
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.de    switch( numrep )
40412027Sjungma@eit.uni-kl.de    {
40512027Sjungma@eit.uni-kl.de	case SC_BIN:
40612027Sjungma@eit.uni-kl.de	case SC_BIN_US:
40712027Sjungma@eit.uni-kl.de	case SC_CSD:
40812027Sjungma@eit.uni-kl.de	    step = 1;
40912027Sjungma@eit.uni-kl.de	   break;
41012027Sjungma@eit.uni-kl.de	case SC_OCT:
41112027Sjungma@eit.uni-kl.de	case SC_OCT_US:
41212027Sjungma@eit.uni-kl.de	    step = 3;
41312027Sjungma@eit.uni-kl.de	    break;
41412027Sjungma@eit.uni-kl.de	case SC_HEX:
41512027Sjungma@eit.uni-kl.de	case SC_HEX_US:
41612027Sjungma@eit.uni-kl.de	    step = 4;
41712027Sjungma@eit.uni-kl.de	    break;
41812027Sjungma@eit.uni-kl.de	default:
41912027Sjungma@eit.uni-kl.de	    step = 0;
42012027Sjungma@eit.uni-kl.de    }
42112027Sjungma@eit.uni-kl.de
42212027Sjungma@eit.uni-kl.de    msb = (int) ceil( double( msb + 1 ) / step ) * step - 1;
42312027Sjungma@eit.uni-kl.de
42412027Sjungma@eit.uni-kl.de    lsb = (int) floor( double( lsb ) / step ) * step;
42512027Sjungma@eit.uni-kl.de
42612027Sjungma@eit.uni-kl.de    if( msb < 0 )
42712027Sjungma@eit.uni-kl.de    {
42812027Sjungma@eit.uni-kl.de	s += '.';
42912027Sjungma@eit.uni-kl.de	if( fmt == SC_F )
43012027Sjungma@eit.uni-kl.de	{
43112027Sjungma@eit.uni-kl.de	    int sign = ( id2.negative() != 0 ) ? ( 1 << step ) - 1 : 0;
43212027Sjungma@eit.uni-kl.de	    for( int i = ( msb + 1 ) / step; i < 0; i ++ )
43312027Sjungma@eit.uni-kl.de	    {
43412027Sjungma@eit.uni-kl.de		if( sign < 10 )
43512027Sjungma@eit.uni-kl.de		    s += static_cast<char>( sign + '0' );
43612027Sjungma@eit.uni-kl.de		else
43712027Sjungma@eit.uni-kl.de		    s += static_cast<char>( sign + 'a' - 10 );
43812027Sjungma@eit.uni-kl.de	    }
43912027Sjungma@eit.uni-kl.de	}
44012027Sjungma@eit.uni-kl.de    }
44112027Sjungma@eit.uni-kl.de
44212027Sjungma@eit.uni-kl.de    int i = msb;
44312027Sjungma@eit.uni-kl.de    while( i >= lsb )
44412027Sjungma@eit.uni-kl.de    {
44512027Sjungma@eit.uni-kl.de        int value = 0;
44612027Sjungma@eit.uni-kl.de        for( int j = step - 1; j >= 0; -- j )
44712027Sjungma@eit.uni-kl.de	{
44812027Sjungma@eit.uni-kl.de            value += static_cast<int>( a.get_bit( i ) ) << j;
44912027Sjungma@eit.uni-kl.de            -- i;
45012027Sjungma@eit.uni-kl.de        }
45112027Sjungma@eit.uni-kl.de        if( value < 10 )
45212027Sjungma@eit.uni-kl.de            s += static_cast<char>( value + '0' );
45312027Sjungma@eit.uni-kl.de	else
45412027Sjungma@eit.uni-kl.de            s += static_cast<char>( value + 'a' - 10 );
45512027Sjungma@eit.uni-kl.de	if( i == -1 )
45612027Sjungma@eit.uni-kl.de	    s += '.';
45712027Sjungma@eit.uni-kl.de    }
45812027Sjungma@eit.uni-kl.de
45912027Sjungma@eit.uni-kl.de    if( lsb > 0 && fmt == SC_F )
46012027Sjungma@eit.uni-kl.de    {
46112027Sjungma@eit.uni-kl.de	for( int i = lsb / step; i > 0; i -- )
46212027Sjungma@eit.uni-kl.de	    s += '0';
46312027Sjungma@eit.uni-kl.de    }
46412027Sjungma@eit.uni-kl.de
46512027Sjungma@eit.uni-kl.de    if( s[s.length() - 1] == '.' )
46612027Sjungma@eit.uni-kl.de	s.discard( 1 );
46712027Sjungma@eit.uni-kl.de
46812027Sjungma@eit.uni-kl.de    if( fmt != SC_F )
46912027Sjungma@eit.uni-kl.de    {
47012027Sjungma@eit.uni-kl.de	if( msb < 0 )
47112027Sjungma@eit.uni-kl.de	    scfx_print_exp( s, ( msb + 1 ) / step );
47212027Sjungma@eit.uni-kl.de	else if( lsb > 0 )
47312027Sjungma@eit.uni-kl.de	    scfx_print_exp( s, lsb / step );
47412027Sjungma@eit.uni-kl.de    }
47512027Sjungma@eit.uni-kl.de
47612027Sjungma@eit.uni-kl.de    if( numrep == SC_CSD )
47712027Sjungma@eit.uni-kl.de	scfx_tc2csd( s, w_prefix );
47812027Sjungma@eit.uni-kl.de}
47912027Sjungma@eit.uni-kl.de
48012027Sjungma@eit.uni-kl.de
48112027Sjungma@eit.uni-kl.deconst char*
48212027Sjungma@eit.uni-kl.deto_string( const scfx_ieee_double& id, sc_numrep numrep, int w_prefix,
48312027Sjungma@eit.uni-kl.de	   sc_fmt fmt, const scfx_params* params = 0 )
48412027Sjungma@eit.uni-kl.de{
48512027Sjungma@eit.uni-kl.de    static scfx_string s;
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de    s.clear();
48812027Sjungma@eit.uni-kl.de
48912027Sjungma@eit.uni-kl.de    if( id.is_nan() )
49012027Sjungma@eit.uni-kl.de        scfx_print_nan( s );
49112027Sjungma@eit.uni-kl.de    else if( id.is_inf() )
49212027Sjungma@eit.uni-kl.de        scfx_print_inf( s, static_cast<bool>( id.negative() ) );
49312027Sjungma@eit.uni-kl.de    else if( id.negative() && ! id.is_zero() &&
49412027Sjungma@eit.uni-kl.de	     ( numrep == SC_BIN_US ||
49512027Sjungma@eit.uni-kl.de	       numrep == SC_OCT_US ||
49612027Sjungma@eit.uni-kl.de	       numrep == SC_HEX_US ) )
49712027Sjungma@eit.uni-kl.de        s += "negative";
49812027Sjungma@eit.uni-kl.de    else if( numrep == SC_DEC )
49912027Sjungma@eit.uni-kl.de        sc_dt::print_dec( s, id, w_prefix, fmt );
50012027Sjungma@eit.uni-kl.de    else
50112027Sjungma@eit.uni-kl.de        sc_dt::print_other( s, id, numrep, w_prefix, fmt, params );
50212027Sjungma@eit.uni-kl.de
50312027Sjungma@eit.uni-kl.de    return s;
50412027Sjungma@eit.uni-kl.de}
50512027Sjungma@eit.uni-kl.de
50612027Sjungma@eit.uni-kl.de
50712027Sjungma@eit.uni-kl.de// explicit conversion to character string
50812027Sjungma@eit.uni-kl.de
50912027Sjungma@eit.uni-kl.deconst std::string
51012027Sjungma@eit.uni-kl.desc_fxval_fast::to_string() const
51112027Sjungma@eit.uni-kl.de{
51212027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, SC_E ) );
51312027Sjungma@eit.uni-kl.de}
51412027Sjungma@eit.uni-kl.de
51512027Sjungma@eit.uni-kl.deconst std::string
51612027Sjungma@eit.uni-kl.desc_fxval_fast::to_string( sc_numrep numrep ) const
51712027Sjungma@eit.uni-kl.de{
51812027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, -1, SC_E ) );
51912027Sjungma@eit.uni-kl.de}
52012027Sjungma@eit.uni-kl.de
52112027Sjungma@eit.uni-kl.deconst std::string
52212027Sjungma@eit.uni-kl.desc_fxval_fast::to_string( sc_numrep numrep, bool w_prefix ) const
52312027Sjungma@eit.uni-kl.de{
52412027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, (w_prefix ? 1 : 0),
52512027Sjungma@eit.uni-kl.de					SC_E ) );
52612027Sjungma@eit.uni-kl.de}
52712027Sjungma@eit.uni-kl.de
52812027Sjungma@eit.uni-kl.deconst std::string
52912027Sjungma@eit.uni-kl.desc_fxval_fast::to_string( sc_fmt fmt ) const
53012027Sjungma@eit.uni-kl.de{
53112027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, fmt ) );
53212027Sjungma@eit.uni-kl.de}
53312027Sjungma@eit.uni-kl.de
53412027Sjungma@eit.uni-kl.deconst std::string
53512027Sjungma@eit.uni-kl.desc_fxval_fast::to_string( sc_numrep numrep, sc_fmt fmt ) const
53612027Sjungma@eit.uni-kl.de{
53712027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, -1, fmt ) );
53812027Sjungma@eit.uni-kl.de}
53912027Sjungma@eit.uni-kl.de
54012027Sjungma@eit.uni-kl.deconst std::string
54112027Sjungma@eit.uni-kl.desc_fxval_fast::to_string( sc_numrep numrep, bool w_prefix, sc_fmt fmt ) const
54212027Sjungma@eit.uni-kl.de{
54312027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, numrep, (w_prefix ? 1 : 0),
54412027Sjungma@eit.uni-kl.de					fmt ) );
54512027Sjungma@eit.uni-kl.de}
54612027Sjungma@eit.uni-kl.de
54712027Sjungma@eit.uni-kl.de
54812027Sjungma@eit.uni-kl.deconst std::string
54912027Sjungma@eit.uni-kl.desc_fxval_fast::to_dec() const
55012027Sjungma@eit.uni-kl.de{
55112027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_DEC, -1, SC_E ) );
55212027Sjungma@eit.uni-kl.de}
55312027Sjungma@eit.uni-kl.de
55412027Sjungma@eit.uni-kl.deconst std::string
55512027Sjungma@eit.uni-kl.desc_fxval_fast::to_bin() const
55612027Sjungma@eit.uni-kl.de{
55712027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_BIN, -1, SC_E ) );
55812027Sjungma@eit.uni-kl.de}
55912027Sjungma@eit.uni-kl.de
56012027Sjungma@eit.uni-kl.deconst std::string
56112027Sjungma@eit.uni-kl.desc_fxval_fast::to_oct() const
56212027Sjungma@eit.uni-kl.de{
56312027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_OCT, -1, SC_E ) );
56412027Sjungma@eit.uni-kl.de}
56512027Sjungma@eit.uni-kl.de
56612027Sjungma@eit.uni-kl.deconst std::string
56712027Sjungma@eit.uni-kl.desc_fxval_fast::to_hex() const
56812027Sjungma@eit.uni-kl.de{
56912027Sjungma@eit.uni-kl.de    return std::string( sc_dt::to_string( m_val, SC_HEX, -1, SC_E ) );
57012027Sjungma@eit.uni-kl.de}
57112027Sjungma@eit.uni-kl.de
57212027Sjungma@eit.uni-kl.de
57312027Sjungma@eit.uni-kl.de// print or dump content
57412027Sjungma@eit.uni-kl.de
57512027Sjungma@eit.uni-kl.devoid
57612027Sjungma@eit.uni-kl.desc_fxval_fast::print( ::std::ostream& os ) const
57712027Sjungma@eit.uni-kl.de{
57812027Sjungma@eit.uni-kl.de    os << sc_dt::to_string( m_val, SC_DEC, -1, SC_E );
57912027Sjungma@eit.uni-kl.de}
58012027Sjungma@eit.uni-kl.de
58112027Sjungma@eit.uni-kl.devoid
58212027Sjungma@eit.uni-kl.desc_fxval_fast::scan( ::std::istream& is )
58312027Sjungma@eit.uni-kl.de{
58412027Sjungma@eit.uni-kl.de    std::string s;
58512027Sjungma@eit.uni-kl.de    is >> s;
58612027Sjungma@eit.uni-kl.de    *this = s.c_str();
58712027Sjungma@eit.uni-kl.de}
58812027Sjungma@eit.uni-kl.de
58912027Sjungma@eit.uni-kl.devoid
59012027Sjungma@eit.uni-kl.desc_fxval_fast::dump( ::std::ostream& os ) const
59112027Sjungma@eit.uni-kl.de{
59212027Sjungma@eit.uni-kl.de    os << "sc_fxval_fast" << ::std::endl;
59312027Sjungma@eit.uni-kl.de    os << "(" << ::std::endl;
59412027Sjungma@eit.uni-kl.de    os << "val = " << m_val << ::std::endl;
59512027Sjungma@eit.uni-kl.de    // TO BE COMPLETED
59612027Sjungma@eit.uni-kl.de    // os << "r_flag   = " << m_r_flag << ::std::endl;
59712027Sjungma@eit.uni-kl.de    // os << "observer = ";
59812027Sjungma@eit.uni-kl.de    // if( m_observer != 0 )
59912027Sjungma@eit.uni-kl.de    //     m_observer->dump( os );
60012027Sjungma@eit.uni-kl.de    // else
60112027Sjungma@eit.uni-kl.de    //     os << "0" << ::std::endl;
60212027Sjungma@eit.uni-kl.de    os << ")" << ::std::endl;
60312027Sjungma@eit.uni-kl.de}
60412027Sjungma@eit.uni-kl.de
60512027Sjungma@eit.uni-kl.de
60612027Sjungma@eit.uni-kl.de// internal use only;
60712027Sjungma@eit.uni-kl.debool
60812027Sjungma@eit.uni-kl.desc_fxval_fast::get_bit( int i ) const
60912027Sjungma@eit.uni-kl.de{
61012027Sjungma@eit.uni-kl.de    scfx_ieee_double id( m_val );
61112027Sjungma@eit.uni-kl.de    if( id.is_zero() || id.is_nan() || id.is_inf() )
61212027Sjungma@eit.uni-kl.de        return false;
61312027Sjungma@eit.uni-kl.de
61412027Sjungma@eit.uni-kl.de    // convert to two's complement
61512027Sjungma@eit.uni-kl.de
61612027Sjungma@eit.uni-kl.de    unsigned int m0 = id.mantissa0();
61712027Sjungma@eit.uni-kl.de    unsigned int m1 = id.mantissa1();
61812027Sjungma@eit.uni-kl.de
61912027Sjungma@eit.uni-kl.de    if( id.is_normal() )
62012027Sjungma@eit.uni-kl.de        m0 += 1U << 20;
62112027Sjungma@eit.uni-kl.de
62212027Sjungma@eit.uni-kl.de    if( id.negative() != 0 )
62312027Sjungma@eit.uni-kl.de    {
62412027Sjungma@eit.uni-kl.de	m0 = ~ m0;
62512027Sjungma@eit.uni-kl.de	m1 = ~ m1;
62612027Sjungma@eit.uni-kl.de	unsigned int tmp = m1;
62712027Sjungma@eit.uni-kl.de	m1 += 1U;
62812027Sjungma@eit.uni-kl.de	if( m1 <= tmp )
62912027Sjungma@eit.uni-kl.de	    m0 += 1U;
63012027Sjungma@eit.uni-kl.de    }
63112027Sjungma@eit.uni-kl.de
63212027Sjungma@eit.uni-kl.de    // get the right bit
63312027Sjungma@eit.uni-kl.de
63412027Sjungma@eit.uni-kl.de    int j = i - id.exponent();
63512027Sjungma@eit.uni-kl.de    if( ( j += 20 ) >= 32 )
63612027Sjungma@eit.uni-kl.de        return ( ( m0 & 1U << 31 ) != 0 );
63712027Sjungma@eit.uni-kl.de    else if( j >= 0 )
63812027Sjungma@eit.uni-kl.de        return ( ( m0 & 1U << j ) != 0 );
63912027Sjungma@eit.uni-kl.de    else if( ( j += 32 ) >= 0 )
64012027Sjungma@eit.uni-kl.de        return ( ( m1 & 1U << j ) != 0 );
64112027Sjungma@eit.uni-kl.de    else
64212027Sjungma@eit.uni-kl.de        return false;
64312027Sjungma@eit.uni-kl.de}
64412027Sjungma@eit.uni-kl.de
64512027Sjungma@eit.uni-kl.de
64612027Sjungma@eit.uni-kl.de// protected methods and friend functions
64712027Sjungma@eit.uni-kl.de
64812027Sjungma@eit.uni-kl.desc_fxval_fast_observer*
64912027Sjungma@eit.uni-kl.desc_fxval_fast::lock_observer() const
65012027Sjungma@eit.uni-kl.de{
65112027Sjungma@eit.uni-kl.de    SC_ASSERT_( m_observer != 0, "lock observer failed" );
65212027Sjungma@eit.uni-kl.de    sc_fxval_fast_observer* tmp = m_observer;
65312027Sjungma@eit.uni-kl.de    m_observer = 0;
65412027Sjungma@eit.uni-kl.de    return tmp;
65512027Sjungma@eit.uni-kl.de}
65612027Sjungma@eit.uni-kl.de
65712027Sjungma@eit.uni-kl.devoid
65812027Sjungma@eit.uni-kl.desc_fxval_fast::unlock_observer( sc_fxval_fast_observer* observer_ ) const
65912027Sjungma@eit.uni-kl.de{
66012027Sjungma@eit.uni-kl.de    SC_ASSERT_( observer_ != 0, "unlock observer failed" );
66112027Sjungma@eit.uni-kl.de    m_observer = observer_;
66212027Sjungma@eit.uni-kl.de}
66312027Sjungma@eit.uni-kl.de
66412027Sjungma@eit.uni-kl.de
66512027Sjungma@eit.uni-kl.de#define SCFX_FAIL_IF_(cnd)                                                    \
66612027Sjungma@eit.uni-kl.de{                                                                             \
66712027Sjungma@eit.uni-kl.de    if( ( cnd ) )                                                             \
66812027Sjungma@eit.uni-kl.de        return static_cast<double>( scfx_ieee_double::nan() );                \
66912027Sjungma@eit.uni-kl.de}
67012027Sjungma@eit.uni-kl.de
67112027Sjungma@eit.uni-kl.dedouble
67212027Sjungma@eit.uni-kl.desc_fxval_fast::from_string( const char* s )
67312027Sjungma@eit.uni-kl.de{
67412027Sjungma@eit.uni-kl.de    SCFX_FAIL_IF_( s == 0 || *s == 0 );
67512027Sjungma@eit.uni-kl.de
67612027Sjungma@eit.uni-kl.de    scfx_string s2;
67712027Sjungma@eit.uni-kl.de    s2 += s;
67812027Sjungma@eit.uni-kl.de    s2 += '\0';
67912027Sjungma@eit.uni-kl.de
68012027Sjungma@eit.uni-kl.de    bool sign_char;
68112027Sjungma@eit.uni-kl.de    int sign = scfx_parse_sign( s, sign_char );
68212027Sjungma@eit.uni-kl.de
68312027Sjungma@eit.uni-kl.de    sc_numrep numrep = scfx_parse_prefix( s );
68412027Sjungma@eit.uni-kl.de
68512027Sjungma@eit.uni-kl.de    int base = 0;
68612027Sjungma@eit.uni-kl.de
68712027Sjungma@eit.uni-kl.de    switch( numrep )
68812027Sjungma@eit.uni-kl.de    {
68912027Sjungma@eit.uni-kl.de	case SC_DEC:
69012027Sjungma@eit.uni-kl.de	{
69112027Sjungma@eit.uni-kl.de	    base = 10;
69212027Sjungma@eit.uni-kl.de	    if( scfx_is_nan( s ) )  // special case: NaN
69312027Sjungma@eit.uni-kl.de		return static_cast<double>( scfx_ieee_double::nan() );
69412027Sjungma@eit.uni-kl.de	    if( scfx_is_inf( s ) )  // special case: Infinity
69512027Sjungma@eit.uni-kl.de		return static_cast<double>( scfx_ieee_double::inf( sign ) );
69612027Sjungma@eit.uni-kl.de	    break;
69712027Sjungma@eit.uni-kl.de	}
69812027Sjungma@eit.uni-kl.de	case SC_BIN:
69912027Sjungma@eit.uni-kl.de	case SC_BIN_US:
70012027Sjungma@eit.uni-kl.de	{
70112027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( sign_char );
70212027Sjungma@eit.uni-kl.de	    base = 2;
70312027Sjungma@eit.uni-kl.de	    break;
70412027Sjungma@eit.uni-kl.de	}
70512027Sjungma@eit.uni-kl.de
70612027Sjungma@eit.uni-kl.de	case SC_BIN_SM:
70712027Sjungma@eit.uni-kl.de	{
70812027Sjungma@eit.uni-kl.de	    base = 2;
70912027Sjungma@eit.uni-kl.de	    break;
71012027Sjungma@eit.uni-kl.de	}
71112027Sjungma@eit.uni-kl.de	case SC_OCT:
71212027Sjungma@eit.uni-kl.de	case SC_OCT_US:
71312027Sjungma@eit.uni-kl.de	{
71412027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( sign_char );
71512027Sjungma@eit.uni-kl.de	    base = 8;
71612027Sjungma@eit.uni-kl.de	    break;
71712027Sjungma@eit.uni-kl.de	}
71812027Sjungma@eit.uni-kl.de	case SC_OCT_SM:
71912027Sjungma@eit.uni-kl.de	{
72012027Sjungma@eit.uni-kl.de	    base = 8;
72112027Sjungma@eit.uni-kl.de	    break;
72212027Sjungma@eit.uni-kl.de	}
72312027Sjungma@eit.uni-kl.de	case SC_HEX:
72412027Sjungma@eit.uni-kl.de	case SC_HEX_US:
72512027Sjungma@eit.uni-kl.de	{
72612027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( sign_char );
72712027Sjungma@eit.uni-kl.de	    base = 16;
72812027Sjungma@eit.uni-kl.de	    break;
72912027Sjungma@eit.uni-kl.de	}
73012027Sjungma@eit.uni-kl.de	case SC_HEX_SM:
73112027Sjungma@eit.uni-kl.de	{
73212027Sjungma@eit.uni-kl.de	    base = 16;
73312027Sjungma@eit.uni-kl.de	    break;
73412027Sjungma@eit.uni-kl.de	}
73512027Sjungma@eit.uni-kl.de	case SC_CSD:
73612027Sjungma@eit.uni-kl.de	{
73712027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( sign_char );
73812027Sjungma@eit.uni-kl.de	    base = 2;
73912027Sjungma@eit.uni-kl.de	    scfx_csd2tc( s2 );
74012027Sjungma@eit.uni-kl.de	    s = (const char*) s2 + 4;
74112027Sjungma@eit.uni-kl.de	    numrep = SC_BIN;
74212027Sjungma@eit.uni-kl.de	    break;
74312027Sjungma@eit.uni-kl.de	}
74412027Sjungma@eit.uni-kl.de       default:;// Martin, what is default???
74512027Sjungma@eit.uni-kl.de    }
74612027Sjungma@eit.uni-kl.de
74712027Sjungma@eit.uni-kl.de    //
74812027Sjungma@eit.uni-kl.de    // find end of mantissa and count the digits and points
74912027Sjungma@eit.uni-kl.de    //
75012027Sjungma@eit.uni-kl.de
75112027Sjungma@eit.uni-kl.de    const char *end = s;
75212027Sjungma@eit.uni-kl.de    bool based_point = false;
75312027Sjungma@eit.uni-kl.de    int int_digits = 0;
75412027Sjungma@eit.uni-kl.de    int frac_digits = 0;
75512027Sjungma@eit.uni-kl.de
75612027Sjungma@eit.uni-kl.de    while( *end )
75712027Sjungma@eit.uni-kl.de    {
75812027Sjungma@eit.uni-kl.de	if( scfx_exp_start( end ) )
75912027Sjungma@eit.uni-kl.de	    break;
76012027Sjungma@eit.uni-kl.de
76112027Sjungma@eit.uni-kl.de	if( *end == '.' )
76212027Sjungma@eit.uni-kl.de	{
76312027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( based_point );
76412027Sjungma@eit.uni-kl.de	    based_point = true;
76512027Sjungma@eit.uni-kl.de	}
76612027Sjungma@eit.uni-kl.de	else
76712027Sjungma@eit.uni-kl.de	{
76812027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( ! scfx_is_digit( *end, numrep ) );
76912027Sjungma@eit.uni-kl.de	    if( based_point )
77012027Sjungma@eit.uni-kl.de		frac_digits ++;
77112027Sjungma@eit.uni-kl.de	    else
77212027Sjungma@eit.uni-kl.de		int_digits ++;
77312027Sjungma@eit.uni-kl.de	}
77412027Sjungma@eit.uni-kl.de
77512027Sjungma@eit.uni-kl.de	end ++;
77612027Sjungma@eit.uni-kl.de    }
77712027Sjungma@eit.uni-kl.de
77812027Sjungma@eit.uni-kl.de    SCFX_FAIL_IF_( int_digits == 0 && frac_digits == 0 );
77912027Sjungma@eit.uni-kl.de
78012027Sjungma@eit.uni-kl.de    // [ exponent ]
78112027Sjungma@eit.uni-kl.de
78212027Sjungma@eit.uni-kl.de    int exponent = 0;
78312027Sjungma@eit.uni-kl.de
78412027Sjungma@eit.uni-kl.de    if( *end )
78512027Sjungma@eit.uni-kl.de    {
78612027Sjungma@eit.uni-kl.de	for( const char *e = end + 2; *e; e ++ )
78712027Sjungma@eit.uni-kl.de	    SCFX_FAIL_IF_( ! scfx_is_digit( *e, SC_DEC ) );
78812027Sjungma@eit.uni-kl.de	exponent = atoi( end + 1 );
78912027Sjungma@eit.uni-kl.de    }
79012027Sjungma@eit.uni-kl.de
79112027Sjungma@eit.uni-kl.de    //
79212027Sjungma@eit.uni-kl.de    // convert the mantissa
79312027Sjungma@eit.uni-kl.de    //
79412027Sjungma@eit.uni-kl.de
79512027Sjungma@eit.uni-kl.de    double integer = 0.0;
79612027Sjungma@eit.uni-kl.de
79712027Sjungma@eit.uni-kl.de    if( int_digits != 0 )
79812027Sjungma@eit.uni-kl.de    {
79912027Sjungma@eit.uni-kl.de
80012027Sjungma@eit.uni-kl.de	bool first_digit = true;
80112027Sjungma@eit.uni-kl.de
80212027Sjungma@eit.uni-kl.de	for( ; s < end; s ++ )
80312027Sjungma@eit.uni-kl.de	{
80412027Sjungma@eit.uni-kl.de	    if( *s == '.' )
80512027Sjungma@eit.uni-kl.de		break;
80612027Sjungma@eit.uni-kl.de
80712027Sjungma@eit.uni-kl.de	    if( first_digit )
80812027Sjungma@eit.uni-kl.de	    {
80912027Sjungma@eit.uni-kl.de		integer = scfx_to_digit( *s, numrep );
81012027Sjungma@eit.uni-kl.de		switch( numrep )
81112027Sjungma@eit.uni-kl.de		{
81212027Sjungma@eit.uni-kl.de		    case SC_BIN:
81312027Sjungma@eit.uni-kl.de		    case SC_OCT:
81412027Sjungma@eit.uni-kl.de		    case SC_HEX:
81512027Sjungma@eit.uni-kl.de		    {
81612027Sjungma@eit.uni-kl.de			if( integer >= ( base >> 1 ) )
81712027Sjungma@eit.uni-kl.de			    integer -= base;  // two's complement
81812027Sjungma@eit.uni-kl.de			break;
81912027Sjungma@eit.uni-kl.de		    }
82012027Sjungma@eit.uni-kl.de		    default:
82112027Sjungma@eit.uni-kl.de			;
82212027Sjungma@eit.uni-kl.de		}
82312027Sjungma@eit.uni-kl.de		first_digit = false;
82412027Sjungma@eit.uni-kl.de	    }
82512027Sjungma@eit.uni-kl.de            else
82612027Sjungma@eit.uni-kl.de	    {
82712027Sjungma@eit.uni-kl.de		integer *= base;
82812027Sjungma@eit.uni-kl.de		integer += scfx_to_digit( *s, numrep );
82912027Sjungma@eit.uni-kl.de	    }
83012027Sjungma@eit.uni-kl.de	}
83112027Sjungma@eit.uni-kl.de    }
83212027Sjungma@eit.uni-kl.de
83312027Sjungma@eit.uni-kl.de    // [ . fraction ]
83412027Sjungma@eit.uni-kl.de
83512027Sjungma@eit.uni-kl.de    double fraction = 0.0;
83612027Sjungma@eit.uni-kl.de
83712027Sjungma@eit.uni-kl.de    if( frac_digits != 0 )
83812027Sjungma@eit.uni-kl.de    {
83912027Sjungma@eit.uni-kl.de	s ++;  // skip '.'
84012027Sjungma@eit.uni-kl.de
84112027Sjungma@eit.uni-kl.de	bool first_digit = ( int_digits == 0 );
84212027Sjungma@eit.uni-kl.de
84312027Sjungma@eit.uni-kl.de	double scale = 1.0;
84412027Sjungma@eit.uni-kl.de
84512027Sjungma@eit.uni-kl.de	for( ; s < end; s ++ )
84612027Sjungma@eit.uni-kl.de	{
84712027Sjungma@eit.uni-kl.de	    scale /= base;
84812027Sjungma@eit.uni-kl.de
84912027Sjungma@eit.uni-kl.de	    if( first_digit )
85012027Sjungma@eit.uni-kl.de	    {
85112027Sjungma@eit.uni-kl.de		fraction = scfx_to_digit( *s, numrep );
85212027Sjungma@eit.uni-kl.de		switch( numrep )
85312027Sjungma@eit.uni-kl.de		{
85412027Sjungma@eit.uni-kl.de		    case SC_BIN:
85512027Sjungma@eit.uni-kl.de		    case SC_OCT:
85612027Sjungma@eit.uni-kl.de		    case SC_HEX:
85712027Sjungma@eit.uni-kl.de		    {
85812027Sjungma@eit.uni-kl.de			if( fraction >= ( base >> 1 ) )
85912027Sjungma@eit.uni-kl.de			    fraction -= base;  // two's complement
86012027Sjungma@eit.uni-kl.de			break;
86112027Sjungma@eit.uni-kl.de		    }
86212027Sjungma@eit.uni-kl.de		    default:
86312027Sjungma@eit.uni-kl.de			;
86412027Sjungma@eit.uni-kl.de		}
86512027Sjungma@eit.uni-kl.de		fraction *= scale;
86612027Sjungma@eit.uni-kl.de		first_digit = false;
86712027Sjungma@eit.uni-kl.de	    }
86812027Sjungma@eit.uni-kl.de	    else
86912027Sjungma@eit.uni-kl.de		fraction += scfx_to_digit( *s, numrep ) * scale;
87012027Sjungma@eit.uni-kl.de	}
87112027Sjungma@eit.uni-kl.de    }
87212027Sjungma@eit.uni-kl.de
87312027Sjungma@eit.uni-kl.de    double exp = ( exponent != 0 ) ? pow( (double) base, (double) exponent )
87412027Sjungma@eit.uni-kl.de	                           : 1;
87512027Sjungma@eit.uni-kl.de
87612027Sjungma@eit.uni-kl.de    return ( sign * ( integer + fraction ) * exp );
87712027Sjungma@eit.uni-kl.de}
87812027Sjungma@eit.uni-kl.de
87912027Sjungma@eit.uni-kl.de#undef SCFX_FAIL_IF_
88012027Sjungma@eit.uni-kl.de
88112027Sjungma@eit.uni-kl.de} // namespace sc_dt
88212027Sjungma@eit.uni-kl.de
88312027Sjungma@eit.uni-kl.de
88412027Sjungma@eit.uni-kl.de// Taf!
885