flat assembler
Message board for the users of flat assembler.

 Index > Main > [fasm 1] Precalculated Float
Author
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
Hi
I would like to pre-calculate float constants, how to do that?
Code:
```.data
struc SOMESTRUC Value,Float
{  .Consatnt1 dd Value#f      ;works ok
.Constant2 dd Value-1      ;ok as integer
.Constant3 dd Value-1#f    ;wrong
.Constant4 dd Float-1f     ;wrong too
TempValue = Float-1f
.Constant5 dd TempValue    ;wrong
}

Something  SOMESTRUC  15, 0.15f
```
29 Jun 2021, 16:34
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
fasm doesn't natively support floating point arithmetic at compile time. Only integer arithmetic is available.
Code:
```x = 3.0 - 2.0 ; not valid
x = 3 - 2 ; okay as integers only    ```
You could probably write a macro, but it would be tricky.
29 Jun 2021, 16:59
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
Look at Constant1 that trick is working. But why I cannot precalculate all values as integer and use the same trick on them by #f ? Have I precalculate it on virtual or something?
How a macro will help me to solve this out if "struc" is already some sort of macro? I'm confused, show me the path

p.s.Seems like it's time to separate forum for fasm1 and fasmg.
29 Jun 2021, 18:19
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
Overclick wrote:
But why I cannot precalculate all values as integer and use the same trick on them by #f ?
The hash symbol (#) is processed before the assembler, so the timing is wrong.

The assembler computes integer arithmetic after the preprocessor has finished processing the hash symbol.
29 Jun 2021, 18:26
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
How to force calculation or delay that bloody hash?
29 Jun 2021, 18:29
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
Overclick wrote:
How to force calculation or delay that bloody hash?
You can't. The preprocessor runs first, then the assembler later.
29 Jun 2021, 18:30
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
29 Jun 2021, 18:33
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
If you want to go ahead with a macro then it might look like this:
Code:
```macro convert_to_float input_integer {
exponent = bsf input_integer
;... more stuff here
dd sign + exponent + mantissa
}

my_value = 3 - 2
convert_to_float my_value    ```
29 Jun 2021, 18:33
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
Thanks
29 Jun 2021, 18:42
Overclick

Joined: 11 Jul 2020
Posts: 471
Location: Ukraine
Overclick
Much easiest way for me to precalculate them inside the code at initialisation stage
Your mathematics is interesting to me anyway. I was thinking to use it for float as alternative to division, but now I don't use it anymore. I'll meditate on it some day.
29 Jun 2021, 18:50
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
That was the easy part.

It gets tricky when you have fractional parts.
Code:
```v1 = 0.15
v2 = 3.0
dd v1 + v2 ; invalid    ```
So you could make an add macro.
Code:
```macro addf float1, float2 {
;some code goes here to do the addition
dd sign + exponent + mantissa
}    ```
29 Jun 2021, 18:51
Roman

Joined: 21 Apr 2012
Posts: 1123
Roman
Quote:

;some code goes here to do the addition
dd sign + exponent + mantissa
}

I not understood macro addf get float1 and float2.
But why in macro dd sign + exponent + mantissa ? And not float1 and float2.
30 Jun 2021, 08:52
Roman

Joined: 21 Apr 2012
Posts: 1123
Roman
I think Fasm need implement some new symbol for this problem topic starter.
30 Jun 2021, 08:53
revolution
When all else fails, read the source

Joined: 24 Aug 2004
Posts: 18606
revolution
Roman wrote:
I not understood macro addf get float1 and float2.
But why in macro dd sign + exponent + mantissa ? And not float1 and float2.
Look at the values:
Code:
```a = 2.0 ; 0x4000_0000_0000_0000
b = 3.0 ; 0x4008_0000_0000_0000
c = 5.0 ; 0x4014_0000_0000_0000
d = a + b ; 0x8008_0000_0000_0000    ```
That last value for d is not the float representation for 5.0. You get a bogus result.
30 Jun 2021, 09:39
idle

Joined: 06 Jan 2011
Posts: 408
Location: Ukraine
idle
exponent = bsf input_integer

d = a + b ; 0x8008_0000_0000_0000

That last value for d is not the float representation for 5.0. You get a bogus result

bsf (input_integer) ; embrace to let expressions
Also the bias \$3fff.
Also sign bit.
And float format.

There are macro to encode 0.etc.
Time loss...
[/b]
30 Jun 2021, 14:19
 Display posts from previous: All Posts1 Day7 Days2 Weeks1 Month3 Months6 Months1 Year Oldest FirstNewest First

 Jump to: Select a forum Official----------------AssemblyPeripheria General----------------MainTutorials and ExamplesDOSWindowsLinuxUnixMenuetOS Specific----------------MacroinstructionsOS ConstructionIDE DevelopmentProjects and IdeasNon-x86 architecturesHigh Level LanguagesProgramming Language DesignCompiler Internals Other----------------FeedbackHeapTest Area

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