PureBasic Forum
http://forums.purebasic.com/english/

PB562 More problems in mixing floats with integers
http://forums.purebasic.com/english/viewtopic.php?f=4&t=72339
Page 1 of 1

Author:  luis [ Fri Feb 22, 2019 12:28 pm ]
Post subject:  PB562 More problems in mixing floats with integers

Original thread viewtopic.php?f=7&t=72322

Problem

Code:
Global.l x = 100

If x < 1.0*1
     Debug "x < 1.0*1" ; no printing, OK
EndIf
 If x < 1.1*1
     Debug "x < 1.1*1" ; it prints "x < 1.1*1", so 100 is less then 1.1 !!! NOT OK
 EndIf


Testing

Code:
Global.l x = 100

; to verify what's happening, let's assign 1.1000000000000001 to a float (1.1000000000000001 is the nearest float to 1.01)

flo.f = 1.1000000000000001

 ; the hexadecimal value stored in a float var to represent 1.1000000000000001 is $3F8CCCCD

Debug "flo.f = " + Hex(PeekL(@flo.f)) ; 3F8CCCCD

; the generated asm for the test code above is

EnableASM

  MOV    dword [v_x],100

; If x < 1.0*1
  MOV    ebx,dword [v_x] ; copy 100 to ebx

; now the compiler "optimizes" the 1.0 * 1 to 1.
; it should keep the zero and consider the expression as float treating the data accordingly

  MOV    eax,1 ; it stores 1 in eax
 
  CMP    ebx,eax ; and then compare that to 100

  JGE   _EndIf2: ; now ebx - eax (100 - 1) is greater than 0, so it jumps

  Debug "x < 1.0*1" ; and this is skipped

; EndIf
!_EndIf2:
; If x < 1.1*1

  MOV    ebx,dword [v_x] ; copy 100 to ebx
 
; again the compiler optimize the 1.1 * 1 to 1.1000000000000001
; this time it does the right thing (so it does two different things for 1.0 and 1.1, a problem in itself ...)
; but in any case insists in not treating the data as float

  ; it stores $3F8CCCCD in EAX and then treat that as an integer in the comparison (so basically the 1.1 becomes garbage)
  MOV    eax,1.1000000000000001 
 
  CMP    ebx,eax ; compares that to 100

  JGE   _EndIf4 ; now ebx - eax (100 - $3F8CCCCD) is not greater than zero so ...

  Debug "x < 1.1*1" ; it falls into this, NOT OK !!!
; EndIf
!_EndIf4:
DisableASM


It's a variation on this theme -> viewtopic.php?f=4&t=59422

Author:  kenmo [ Tue May 14, 2019 8:17 pm ]
Post subject:  Re: PB562 More problems in mixing floats with integers

Definitely a bug, and thank you for investigating it.

Bugs like this in fundamental features like type casting worry me the most!

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/