flat assembler
Message board for the users of flat assembler.
 Home   FAQ   Search   Register 
 Profile   Log in to check your private messages   Log in 
flat assembler > Macroinstructions > [fasmg] display 1.33e7

Author
Thread Post new topic Reply to topic
_shura



Joined: 22 May 2015
Posts: 60
[fasmg] display 1.33e7
Ohai,
is there a simple way to display floating point values in fasmg or do I have parse IEEE 751 manually?

Code:

Repeat 1temp: ( 1.33e7 )
  display `temp
End Repeat



Unfortunately does not work.
Post 20 Sep 2017, 12:43
View user's profile Send private message Visit poster's website Reply with quote
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 6676
Location: Kraków, Poland
Instead of parsing the output format, you can extract the fields of a floating point value with BSR, SHL and TRUNC operators.

There is also a simple showfloat macro that you could use as a starting point, but it does not generate scientific notation.
Post 20 Sep 2017, 13:18
View user's profile Send private message Visit poster's website Reply with quote
_shura



Joined: 22 May 2015
Posts: 60
I solved it, but I do not really like this solution:

Code:

null = 0
Struc float2decimal                     value*,                                 precision: ( 4 )
  Local absValuesignValueabsPowersignPowerabsReal
  If      ( value = 0.0 )
    absValue                            =                                       ( 0.0 )
    Virtual                             At null
      dq                                value
      Load                              temp qword                              From null
    End Virtual
    If ( temp and 0x8000000000000000 )
      signValue                         Equ                                     '-'
    Else
      signValue                         Equ                                     '+'
    End If
  Else If ( value < 0.0 )
    absValue                            =                                       ( 0 - value )
    signValue                           Equ                                     '-'
  Else
    absValue                            =                                       ( 0 + value )
    signValue                           Equ                                     '+'
  End If
  absPower                              =                                       ( 0 )
  If      ( absValue =   0.0 )
    signPower                           Equ                                     ''
  Else If ( absValue >= 10.0 )
    While ( absValue >= 10.0 )
      absValue                          =                                       ( absValue / 10.0 )
      absPower                          =                                       ( absPower + 1 )
    End While
    signPower                           Equ                                     '+'
  Else If ( absValue <  1.0 )
    While ( absValue < 1.0 )
      absValue                          =                                       ( absValue * 10.0 )
      absPower                          =                                       ( absPower + 1 )
    End While
    signPower                           Equ                                     '-'
  Else
    signPower                           Equ                                     ''
  End If
  If      ( precision > 0 )
    Virtual                             At null
      db '.'
      rb precision
      db ''
      temp                              =                                       ( absValue - ( trunc absValue ))
      Repeat                            ( precision ),                          offs: ( 1 )
        temp                            =                                       ( temp * 10.0 )
        Store                           byte ( '0' + ( trunc temp ))            At offs
        temp                            =                                       ( temp - ( trunc temp ))
      End Repeat
      If ( temp >=  0.499999999999999999 )
        Repeat                          ( precision ),                          offs: ( null )
          Load                          temp byte                               From  ( precision - offs )
          If ( temp = '9' )
            temp                        =                                       '0'
          Else
            temp                        =                                       temp + 1
          End If
          Store                         byte temp                               At ( precision - offs )
          If ( temp <> '0' )
            Break
          End If
        End Repeat
        If ( temp = '0' )
          absValue                      =                                       ( absValue + 1 )
        End If
      End If
      Load                              absReal ( precision + 1 )               From null
    End Virtual
  Else If ( precision > 0 )
    err 'float2decimal''precision must be a positive integer or null'
  End If
  Repeat                                1,                                      integerPart: ( trunc absValue )
    Repeat                              1,                                      powerPart: (         absPower )
      .                                 Equ                                     signValue, `integerPartstring absReal'e'signPower, `powerPart
    End Repeat
  End Repeat
End Struc
temp float2decimal                      -1.337e-23
display temp10



Its very tricky to round the values correctly, because 0.5 is in fact 0.4999…
-0.0 is in fact different from +0.0, but fasmg says, that they are equal, so I had to get the sign from the binary value, where it is encoded correctly.
Post 20 Sep 2017, 15:03
View user's profile Send private message Visit poster's website Reply with quote
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 6676
Location: Kraków, Poland
This is a loop-less method I experimented with:

Code:
LG2 = 0.30102999566398119521373889472449302676818988146210854131

struc showfloat value,precision:2
        local x,pow,t,sgn,txt
        x = value
        if x = 0
                . = '0'
        else
                sgn = 0
                if x < 0
                        x = -x
                        sgn = 1
                end if
                pow = trunc(bsr x * LG2)
                if pow-precision >= 0
                        repeat 1p:pow-precision
                                x = x / 1e#p
                        end repeat
                else
                        repeat 1p:-pow+precision
                                x = x / 1e-p
                        end repeat
                end if
                if x < 1e#precision
                        x = x * 10
                        pow = pow - 1
                end if
                t = trunc x
                if x - t >= float 1/2
                        t = t + 1
                end if
                if t >= 10e#precision
                        x = x / 10
                        pow = pow + 1
                        t = trunc x
                        if x - t >= float 1/2
                                t = t + 1
                        end if
                end if
                if pow>=0
                        repeat 1p:pow
                                txt = 'e' + `p shl 8
                        end repeat
                else
                        repeat 1p:-pow
                                txt = 'e-' + `p shl 16
                        end repeat
                end if
                repeat 1i:t
                        txt = `i + txt shl (8*lengthof `i)
                end repeat
                txt = txt and 0FFh + '.' shl 8 + (txt shr 8shl 16
                if sgn
                        txt = txt shl 8 + '-'
                end if
                . = string txt
        end if
end struc

tmp showfloat -1.337e-23
display tmp

It may need more work, but I do not have too much time on my hands at the moment.
Post 20 Sep 2017, 17:13
View user's profile Send private message Visit poster's website Reply with quote
_shura



Joined: 22 May 2015
Posts: 60
But this failes with

Code:

temp showfloat -13.3775e-234
display temp ;=> -1.3377e-22



and not as expected -1.3378e-22
Post 20 Sep 2017, 17:56
View user's profile Send private message Visit poster's website Reply with quote
Tomasz Grysztar
Assembly Artist


Joined: 16 Jun 2003
Posts: 6676
Location: Kraków, Poland
See my last sentence above.
Post 20 Sep 2017, 18:38
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >

Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001-2005 phpBB Group.

Main index   Download   Documentation   Examples   Message board
Copyright © 2004-2016, Tomasz Grysztar.