Real to Integer Conversion Issues

AoW_Hun7312

I'm a magic man, I've got magic hands.
Reaction score
76
When I convert my real to integer, it doesn't convert correctly. The value of the real is 315.00, and the value of the integer ends up being 314. I found a way to bypass this by using R2S and S2I in conjunction, but there has to be a simpler way. Can anyone help?
 

Ashlebede

New Member
Reaction score
43
Maybe it's not floored correctly... maybe doing [ljass]R2I(current+.1)[/ljass] would work. u_u
 

uberfoop

~=Admiral Stukov=~
Reaction score
177
Real operations in general in wc3 have idiotic results that are often off by extremely small amounts. It's possible that the R2I things that the real is like, slightly below 315. This wouldn't happen with S2I(R2S( because R2S rounds out to only a few decimal places, so the S2I conversion would see 315.000 or whatever instead of 314.999999999blahblahblah what the game thinks it is.

Or something. I think.


But yeah, either don't worry about it or go with Ashlebede's plan of adding a small value. You could probably even get away with making it a very small value, like .001.
 

tooltiperror

Super Moderator
Reaction score
231
Oh yes, the crappy world of WC3 numbers and mathematics. Horribly done, hopefully the next decent blizzard WC game has better math.

If you really wanted to, you could go with your [LJASS]S2I(R2S(somereal))[/LJASS] approach and make a function that JASSHelper will automatically inline, which is probably the easiest thing to do.

JASS:

.
 function Real2Integer takes real r returns integer
     return S2I(R2S(r))
 endfunction


Of course, I'm pretty sure that double-converting works to, and I think that parsing a string in C++ is slower than converting integers and floats, so it may be quicker to 'double-convert' like this, although I'm not even sure if it works, although I think I remember doing this in a minigame map I made to get rid of those nasty .000's before they even appeared or something.

JASS:

.
 function Real2Integer takes real r returns integer
     return R2I(I2R(R2I(r)))
 endfunction


If that does work, it is probably the best thing to do, and it inlines thanks to Vexorian's genius.
 

Bribe

vJass errors are legion
Reaction score
67
JASS:
R2I(I2R(R2I(r)))


That will produce the same thing as

JASS:
R2I(r)


They will never produce different results.
 

saw792

Is known to say things. That is all.
Reaction score
280
Just to clear something up... this isn't a wc3 maths problem, this is a floating point problem related to how floating point numbers are represented internally by the computer. You will find the same problem in most programming languages, which is why you should never compare reals for equality.
 

uberfoop

~=Admiral Stukov=~
Reaction score
177
Just to clear something up... this isn't a wc3 maths problem, this is a floating point problem related to how floating point numbers are represented internally by the computer. You will find the same problem in most programming languages, which is why you should never compare reals for equality.
Yeah, it happens in any floating point system. However, I still blame Blizzard for all the madness. Casual mappers + floating point arithmatic + no warning signs = WTF!?
 

Bribe

vJass errors are legion
Reaction score
67
Not only, but so many parameters in this game depend on floating-points because of coordinates, facing angles, damage, HP, MP, fog values...

You would think HP and MP would be integer-based, based on what you see in-game with it.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top