Page 1 of 1

Convert Real to Scientific Format

Posted: Wed Jun 22, 2011 7:57 pm
by Jack
Hello,

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

Any function ?

10000 ==> 1,E+04

Thanks

Re: Convert Real to Scientific Format

Posted: Thu Jun 23, 2011 2:04 am
by nageswaragunupudi
Method-1

Code: Select all

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: Select all

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: Select all

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
 

Re: Convert Real to Scientific Format

Posted: Thu Jun 23, 2011 4:46 am
by nageswaragunupudi
One more way:

Code: Select all

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.

Re: Convert Real to Scientific Format

Posted: Thu Jun 23, 2011 12:25 pm
by Enrico Maria Giordano
Try also this sample using C language:

Code: Select all

#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

Re: Convert Real to Scientific Format

Posted: Thu Jun 23, 2011 12:28 pm
by nageswaragunupudi
Mr Enrico

Excellent idea !!!

Re: Convert Real to Scientific Format

Posted: Thu Jun 23, 2011 3:00 pm
by Jack
Thanks for this feed back .