--------------------------------------------------------------------------------------------------
[BUG/PRB.] ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE CEILING() FUNCTION
January 2026
--------------------------------------------------------------------------------------------------
CCB
1. BUG:
There is a test program:
*PROC testceilingfunction
SET DECIMALS TO 2
?CEILING(-4294967295/16777216) && Displays -256 if SET("DECIMALS")<=3
SET DECIMALS TO 10
?CEILING(-4294967295/16777216) && Displays -255 if SET("DECIMALS")>=4
RETURN
* END OF PROC TESTCEILINGFUNCTION.
We think they will display -255, but:
?CEILING(-4294967295/16777216) && Displays -256 if SET("DECIMALS")<=3
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Label74aad2 ::
push ecx ;0x0074aad2 : 51
push esi ;0x0074aad3 : 56
push edi ;0x0074aad4 : 57
call Fun420d8c ;0x0074aad5 : e8b262cdff
mov esi , eax ;0x0074aada : 8bf0
push esi ;0x0074aadc : 56
lea edi , dword ptr [ esp + 12 ] ;0x0074aadd : 8d7c240c
call Fun420dd3 ;0x0074aae1 : e8ed62cdff
test eax , eax ;0x0074aae6 : 85c0
jne Label74ab9d ;0x0074aae8 : 0f85af000000
mov al , byte ptr [esi] ;0x0074aaee : 8a06
cmp al , 049h ;0x0074aaf0 : 3c49
je Label74ab84 ;0x0074aaf2 : 0f848c000000
cmp al , 04Eh ;0x0074aaf8 : 3c4e
je Label74ab32 ;0x0074aafa : 7436
cmp al , 059h ;0x0074aafc : 3c59
je Label74ab28 ;0x0074aafe : 7428
test byte ptr [ Data936f10 ] , 01h ;0x0074ab00 : f605106f930001
je Label74ab1e ;0x0074ab07 : 7415
mov eax , dword ptr [ Data936f14 ] ;0x0074ab09 : a1146f9300
test eax , eax ;0x0074ab0e : 85c0
jne Label74ab8b ;0x0074ab10 : 7579
mov dword ptr [ Data936f14 ] , 0385h ;0x0074ab12 : c705146f930085030000
jmp Label74ab8b ;0x0074ab1c : eb6d
Label74ab1e ::
mov ecx , 0385h ;0x0074ab1e : b985030000
call Fun544742 ;0x0074ab23 : e81a9cdfff
Label74ab28 ::
lea eax , dword ptr [ esi + 24 ] ;0x0074ab28 : 8d4618
call Fun6daac5 ;0x0074ab2b : e895fff8ff
jmp Label74ab8b ;0x0074ab30 : eb59
Label74ab32 ::
fld qword ptr [ esi + 16 ] ;0x0074ab32 : dd4610
sub esp , 08h ;0x0074ab3f : 83ec08
;
; -----------------------------------------------------------------------------------------------------
; VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE CEILING() FUNCTION
; March 2023
; -----------------------------------------------------------------------------------------------------
; CCB
;
; Sometimes the CEILING() function returns wrong result, for example,
; SET DECIMALS TO 2
; ?CEILING(-4294967295/16777216) && Displays -256 if SET("DECIMALS")<=3
; SET DECIMALS TO 10
; ?CEILING(-4294967295/16777216) && Displays -255 if SET("DECIMALS")>=4
;
; 2023/3/21, by ccb
;
cmp dword ptr vfpa_sys9146_data,00h
jne Label74ab38
cmp dword ptr vfpa_sys9127_data,00h
je Label74ab38
fld st(0)
fabs
fldlg2
fxch st(1)
fyl2x
fld st(0)
fistp dword ptr [ esp ]
mov edx,dword ptr [ esp ]
cmp edx,80000000h
je Label74ab37
and edx,80000000h
test edx,edx
jne Label74ab37
mov eax,0
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fadd qword ptr [ 8 * eax + esi ]
pop esi
ELSE
fadd qword ptr [ 8 * eax + offset Data922438 ]
ENDIF
mov eax,0Ah
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fadd qword ptr [ 8 * eax + esi ]
pop esi
ELSE
fadd qword ptr [ 8 * eax + offset Data922438 ]
ENDIF
fistp dword ptr [ esp ]
mov eax,dword ptr vfpa_sys9204_data
sub eax,dword ptr [ esp ]
cmp eax,00h
jle Label74ab38
cmp eax,dword ptr vfpa_sys9204_data
jg Label74ab38
mov ecx,dword ptr [ esi + 8 ]
cmp ecx,dword ptr vfpa_sys9205_data
jle Label74ab35
mov ecx,dword ptr vfpa_sys9205_data
Label74ab35 ::
cmp eax,ecx
jge Label74ab38
fld st(0)
fistp dword ptr [ esp ]
mov edx,dword ptr [ esp ]
cmp edx,80000000h
je Label74ab38
and edx,80000000h
test edx,edx
jne Label74ab36
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fsub qword ptr [ 8 * eax + esi ]
pop esi
ELSE
fsub qword ptr [ 8 * eax + offset Data922438 ]
ENDIF
jmp Label74ab42
Label74ab36 ::
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fsub qword ptr [ 8 * eax + esi ]
pop esi
ELSE
fsub qword ptr [ 8 * eax + offset Data922438 ]
ENDIF
jmp Label74ab42
Label74ab37 ::
fstp st(0)
jmp Label74ab38
Label74ab38 ::
mov eax , dword ptr [ esi + 8 ] ;0x0074ab35 : 8b4608
;
; -----------------------------------------------------------------------------------------------------
; VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE CEILING() FUNCTION
; March 2023
; -----------------------------------------------------------------------------------------------------
; CCB
;
; Sometimes the CEILING() function returns wrong result, for example,
; SET DECIMALS TO 2
; ?CEILING(-4294967295/16777216) && Displays -256 if SET("DECIMALS")<=3
; SET DECIMALS TO 10
; ?CEILING(-4294967295/16777216) && Displays -255 if SET("DECIMALS")>=4
;
; 2023/3/21, by ccb
;
cmp eax,dword ptr vfpa_sys9205_data
jle Label74ab39
mov eax,dword ptr vfpa_sys9205_data
Label74ab39 ::
IFDEF RAX
push esi
lea esi , dword ptr [ Data922450 ]
fsub qword ptr [ 8 * eax + esi ] ;0x0074ab38 : dc24c550249200
pop esi
ELSE
fsub qword ptr [ 8 * eax + offset Data922450 ] ;0x0074ab38 : dc24c550249200
ENDIF
Label74ab42 ::
fst qword ptr [ esi + 16 ] ;0x0074ab42 : dd5610
fstp qword ptr [ esp ] ;0x0074ab45 : dd1c24
call ceil ;0x0074ab48 : ff15e8799100
xor ecx , ecx ;0x0074ab4e : 33c9
fst qword ptr [ esi + 16 ] ;0x0074ab50 : dd5610
mov cx , word ptr [ esi + 22 ] ;0x0074ab53 : 668b4e16
add esp , 08h ;0x0074ab57 : 83c408
shr ecx , 04h ;0x0074ab5a : c1e904
and ecx , 07FFh ;0x0074ab5d : 81e1ff070000
sub ecx , 03FFh ;0x0074ab63 : 81e9ff030000
cmp ecx , 01Fh ;0x0074ab69 : 83f91f
jnl Label74ab7b ;0x0074ab6c : 7d0d
call Fun4337e6 ;0x0074ab6e : e8738cceff
mov dword ptr [ esi + 12 ] , eax ;0x0074ab73 : 89460c
mov byte ptr [esi] , 049h ;0x0074ab76 : c60649
jmp Label74ab7d ;0x0074ab79 : eb02
Label74ab7b ::
fstp st(0) ;0x0074ab7b : ddd8
Label74ab7d ::
mov dword ptr [ esi + 8 ] , 00h ;0x0074ab7d : c7460800000000
Label74ab84 ::
mov dword ptr [ esi + 4 ] , 014h ;0x0074ab84 : c7460414000000
Label74ab8b ::
mov eax , dword ptr [ esp + 8 ] ;0x0074ab8b : 8b442408
test eax , eax ;0x0074ab8f : 85c0
je Label74ab9d ;0x0074ab91 : 740a
mov byte ptr [esi] , 030h ;0x0074ab93 : c60630
mov dword ptr [ esi + 12 ] , 049h ;0x0074ab96 : c7460c49000000
Label74ab9d ::
pop edi ;0x0074ab9d : 5f
pop esi ;0x0074ab9e : 5e
pop ecx ;0x0074ab9f : 59
ret ;0x0074aba0 : c3
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix259.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix23.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix24.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix37.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix38.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix97.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix98.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix123.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix124.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix255.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix256.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix257.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix258.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix303.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix304.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix305.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix306.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix373.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix374.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix409.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix410.asp
2, foxite.com:
https://www.foxite.com/archives/binary-to-hex-0000494011.htm
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|