int() function

Blitz3D Forums/Blitz3D Beginners Area/int() function

Wiering(Posted 2004) [#1]
Why on earth does the Int() function round .5 values to the nearest even number?

Int(2.5) = 2
Int(3.5) = 4

(I already found a workaround using the Floor() function, but I'm still wondering what the reason could be for the Int to work that way).


DJWoodgate(Posted 2004) [#2]
I think this has something to do with it...

Print 1.5+2.5+3.5+4.5+5.5+6.5
Print Floor(1.5)+Floor(2.5)+Floor(3.5)+Floor(4.5)+Floor(5.5)+Floor(6.5)
Print Int(1.5)+Int(2.5)+Int(3.5)+Int(4.5)+Int(5.5)+Int(6.5)
WaitKey()


soja(Posted 2004) [#3]
That's just the way the language was designed. Do you expect it to do something other than what the docs say?


Int: Converts the value to the nearest integer.
Floor: Rounds downward, i.e. in the direction of -Infinity.
Ceil: Rounds upward, i.e. in the direction of Infinity.




Shifty Geezer(Posted 2004) [#4]
The nearest number is always up for .5 or above, down for less than .5.

The proper results for Int() should be
Int(2.5)=3
Int(3.5)=4

The manual explanation should read "Int:Converts the value to the nearest even integer" to accurately describe what Blitz implementation of the function does.


Sledge(Posted 2004) [#5]
I think it rounds up and down alternatively to decrease floating point error.


Shifty Geezer(Posted 2004) [#6]
It shouldn't though, not according to both the Manual and the traditional implementation of Int() in countless other languages!


Sledge(Posted 2004) [#7]

It shouldn't though



Why not? Operators have different precedence to their real-world counterparts too; unlike C, calculations return the faster type unless you specify otherwise... not all computational standards are necessarily equal. Blitz is mostly used for games, not scientific simulations - keeping floating point error in check in this manner is totally acceptable for a game-oriented language. There's nothing to stop you rolling your own function to behave in the traditional manner if that's what you want.


WolRon(Posted 2004) [#8]
It shouldn't though, not according to both the Manual
Um, I don't know what you're smoking, but the manual does state that it works that way:
Int( value )
Parameters:
value = a number, or a string which represents a number
Description:
Converts the value to the nearest integer. 

This is the same as Blitz's automatic type conversion. 
So the two commands... 

n = value 
n = Int( value ) 

... do exactly the same thing when n is an integer variable. 

If Int is applied to a string it converts as much as possible: 

Int( "10" ) ........ result is 10 
Int( "3.7" ) ....... result is 3, stops at "." which can't be part of an integer 
Int( "junk3" ) .... result is 0, stops at "j" 

Int converts floating point numbers by rounding to the nearest integer. 
NOTE: This is not the traditional meaning of Int in Basic. 

What about numbers exactly halfway between integers? 
The rounding is to the nearest even integer: 

Int( 2.5 ) ... produces 2 
Int( 3.5 ) ... produces 4 

See also Floor and Ceil for other types of rounding.