--------------------------------------------------------------------------------------------------
                      [BUG/PRB.] ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE CEILING() FUNCTION
                                January 2024
                 --------------------------------------------------------------------------------------------------
                                    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

             cmp dword ptr [ esi + 8 ],0Fh
             jge 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,0Fh
             sub eax,dword ptr [ esp ]
             cmp eax,0
             jl Label74ab38
             cmp eax,0Fh
             jg Label74ab38

             cmp eax,dword ptr [ esi + 8 ]
             jle 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
             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

     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.