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