FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Convert Real to Scientific Format
Posts: 300
Joined: Wed Jul 11, 2007 11:06 AM
Convert Real to Scientific Format
Posted: Wed Jun 22, 2011 07:57 PM

Hello,

I have to convert a numeric to a scientific notation , How to ??

Any function ?

10000 ==> 1,E+04

Thanks

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Convert Real to Scientific Format
Posted: Thu Jun 23, 2011 02:04 AM
Method-1
Code (fw): Select all Collapse
function N2E( nNum, nDec )

   local e := 0, cRet

   DEFAULT nDec := 2

   if nNum >= 10
      do while nNum >= 10
         nNum  /= 10
         e++
      enddo
   elseif nNum < 1
      do while nNum < 1
         nNum  *= 10
         e--
      enddo
   endif
   cRet  := Str( nNum, nDec + 2, nDec ) + " E " + If( e >= 0, "+", "" ) + LTrim( Str( e ) )

return cRet

Method-2
Code (fw): Select all Collapse
function N2E( nNum, nDec )

   local e := 0, cRet

   DEFAULT nDec := 2

   e     := Floor( Log10( nNum ) )
   nNum  *= 10 ^ ( -e )

   cRet  := Str( nNum, nDec + 2, nDec ) + " E " + If( e >= 0, "+", "" ) + LTrim( Str( e ) )

return cRet

I personally like the approach in the second function. But I am not sure which is faster.

Also
Code (fw): Select all Collapse
function N2E( nNum, nDec )

   local e := 0, nLog, cRet

   DEFAULT nDec := 2

   nLog  := Log10( nNum )
   e     := Floor( nLog )
   nNum  := 10 ^ ( nLog - e )
   cRet  := Str( nNum, nDec + 2, nDec ) + " E " + If( e >= 0, "+", "" ) + LTrim( Str( e ) )

return cRet
Regards



G. N. Rao.

Hyderabad, India
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Convert Real to Scientific Format
Posted: Thu Jun 23, 2011 04:46 AM
One more way:
Code (fw): Select all Collapse
function N2SCI( nNum, nDec )

   local e  := 0
   local nAt, cRet

   DEFAULT nDec := 2

   cRet     := LTrim( Str( nNum ) )
   if nNum >= 10
      nAt   := At( ".", cRet + "." )
      e     := nAt - 2
      cRet  := Left( cRet, 1 ) + "." + SubStr( cRet, 2, nAt - 2 ) + SubStr( cRet, nAt + 1 )
      cRet  := LTrim( Str( Val( cRet ), nDec + 2, nDec ) )
      cRet  += " E +" + LTrim( Str( e ) )
   elseif nNum < 1
      nAt   := 3
      do while SubStr( cRet, nAt, 1 ) == '0'
         nAt++
      enddo
      e     := nAt - 2
      cRet  := SubStr( cRet, nAt, 1 ) + "." + SubStr( cRet, nAt + 1 )
      cRet  := LTrim( Str( Val( cRet ), nDec + 2, nDec ) )
      cRet  += " E -" + LTrim( Str( e ) )
   else
      cRet  := Str( nNum, nDec + 2, nDec ) + " E +0"
   endif

return cRet

We can compare performance of the above functions and choose the fastest.
Regards



G. N. Rao.

Hyderabad, India
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: Convert Real to Scientific Format
Posted: Thu Jun 23, 2011 12:25 PM
Try also this sample using C language:

Code (fw): Select all Collapse
#include "Fivewin.ch"


FUNCTION MAIN()

    ? N2E( 10000 )

    RETURN NIL



#pragma BEGINDUMP

#include "hbapi.h"


HB_FUNC( N2E )
{
    char Buf[ 100 ];

    sprintf( Buf, "%E", hb_parnd( 1 ) );

    hb_retc( Buf );
}

#pragma ENDDUMP


EMG
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Convert Real to Scientific Format
Posted: Thu Jun 23, 2011 12:28 PM

Mr Enrico

Excellent idea !!!

Regards



G. N. Rao.

Hyderabad, India
Posts: 300
Joined: Wed Jul 11, 2007 11:06 AM
Re: Convert Real to Scientific Format
Posted: Thu Jun 23, 2011 03:00 PM

Thanks for this feed back .

Continue the discussion