---------------------------------------------------------------------------------------------------
[BUG/PRB.] ADJUST THE PRECISION OF THE FLOATING-POINT CONSTANTS FOR THE DIVISION OPERATOR
January 2026
---------------------------------------------------------------------------------------------------
CCB
1. BUG:
There is a test program:
*PROC testfloatingpointconstdivision
SET DECIMALS TO 2
?INT(4294967295/16777216) && Displays 256 if SET("DECIMALS")<=3
SET DECIMALS TO 10
?INT(4294967295/16777216) && Displays 255 if SET("DECIMALS")>=4
RETURN
* END OF PROC TESTFLOATINGPOINTCONSTDIVISION.
We think they will display 255, but:
?INT(4294967295/16777216) && Displays 256 if SET("DECIMALS")<=3
2. CAUSE:
In VFP 9.0 and earlier versions, the code:
?INT(4294967295/16777216)
will be compiled to:
17 00 02 F8 03 01 FC 43 FA 0A 00 00 00 E0 FF FF FF 6F 40 CC 38 FD FE
--------------------------------------------------------------------
VFP will calculate 4294967295/16777216 at compile time,
the result is 255.99999994039535520 (0x406FFFFFFFE00000),
the width of the floating-point number is 0x0A (dec: 10),
the number of decimal places is 0x00 (dec: 0).
For the details when VFP 9.0 calculates INT(4294967295/16777216):
SET DECIMALS TO 2
255. 9999 9994 0395 3552 0
+ 0. 0000 0500 0000 0000 0 (n=2, eps = 0.5*10^(-(n+3)) = 5.0000000000000004090E-06)
----------------------------
256. 0000 0494 0395 3426 0
So INT(4294967295/16777216) = 256 if SET("DECIMALS")=2.
SET DECIMALS TO 10
255. 9999 9994 0395 3552 0
+ 0. 0000 0000 0000 0500 0 (n=10, eps = 0.5*10^(-(n+3)) = 5.0000000000000001520E-14)
----------------------------
255. 9999 9994 0395 4121 0
So INT(4294967295/16777216) = 255 if SET("DECIMALS")=10.
In VFP Advanced, the code:
?INT(4294967295/16777216)
will be compiled to:
17 00 02 F8 03 01 FC 43 FA 17 0C 00 00 E0 FF FF FF 6F 40 CC 38 FD FE
--------------------------------------------------------------------
VFP will calculate 4294967295/16777216 at compile time,
the result is 255.99999994039535520 (0x406FFFFFFFE00000),
the width of the floating-point number is 0x17 (dec: 23),
the number of decimal places is 0x0C (dec: 12).
For the details when VFP Advanced calculates INT(4294967295/16777216):
SET DECIMALS TO 2
255. 9999 9994 0395 3552 0
+ 0. 0000 0000 0000 0005 0 (n=12, eps = 0.5*10^(-(n+3)) = 5.0000000000000001820E-16)
----------------------------
255. 9999 9994 0395 3552 0
So INT(4294967295/16777216) = 255 if SET("DECIMALS")=2.
SET DECIMALS TO 10
255. 9999 9994 0395 3552 0
+ 0. 0000 0000 0000 0005 0 (n=12, eps = 0.5*10^(-(n+3)) = 5.0000000000000001520E-16)
----------------------------
255. 9999 9994 0395 3552 0
So INT(4294967295/16777216) = 255 if SET("DECIMALS")=10.
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Label8475c9 ::
cmp bl , 0FAh ;0x008475c9 : 80fbfa
je Label8475db ;0x008475cc : 740d
fild dword ptr [edi] ;0x008475ce : db07
mov byte ptr [ edi + 16 ] , 0FAh ;0x008475d0 : c64710fa
mov byte ptr [ edi + 18 ] , 00h ;0x008475d4 : c6471200
fstp qword ptr [ edi + 8 ] ;0x008475d8 : dd5f08
Label8475db ::
cmp byte ptr [ ecx + 16 ] , 0FAh ;0x008475db : 807910fa
je Label8475ee ;0x008475df : 740d
fild dword ptr [ecx] ;0x008475e1 : db01
mov byte ptr [ ecx + 16 ] , 0FAh ;0x008475e3 : c64110fa
mov byte ptr [ ecx + 18 ] , 00h ;0x008475e7 : c6411200
fstp qword ptr [ ecx + 8 ] ;0x008475eb : dd5908
Label8475ee ::
fld qword ptr [ Data91fbc8 ] ;0x008475ee : dd05c8fb9100
fld qword ptr [ ecx + 8 ] ;0x008475f4 : dd4108
fucompp ;0x008475f7 : dae9
fstsw ax ;0x008475f9 : dfe0
test byte ptr ah , 044h ;0x008475fb : f6c444
jnp Label8474df ;0x008475fe : 0f8bdbfeffff
fld qword ptr [ edi + 8 ] ;0x00847604 : dd4708
mov dword ptr [ Data93cc80 ] , 00h ;0x00847607 : c70580cc930000000000
fdiv qword ptr [ ecx + 8 ] ;0x00847611 : dc7108
mov eax , dword ptr [ Data93cc80 ] ;0x00847614 : a180cc9300
test eax , eax ;0x00847619 : 85c0
fstp qword ptr [ edi + 8 ] ;0x0084761b : dd5f08
jne Label8474df ;0x0084761e : 0f85bbfeffff
mov al , byte ptr [ edi + 18 ] ;0x00847624 : 8a4712
test al , al ;0x00847627 : 84c0
je Label847638 ;0x00847629 : 740d
mov bl , byte ptr [ edi + 17 ] ;0x0084762b : 8a5f11
or dl , 0FFh ;0x0084762e : 80caff
sub dl , al ;0x00847631 : 2ad0
add bl , dl ;0x00847633 : 02da
mov byte ptr [ edi + 17 ] , bl ;0x00847635 : 885f11
Label847638 ::
movzx ecx ,byte ptr [ ecx + 18 ] ;0x00847638 : 0fb64912
movzx edx , al ;0x0084763c : 0fb6d0
lea eax , dword ptr [ edx + ecx ] ;0x0084763f : 8d040a
;
; ------------------------------------------------------------------------------------------------------
; VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT CONSTANTS FOR THE DIVISION OPERATOR
; February 2024
; ------------------------------------------------------------------------------------------------------
; CCB
;
; Adjust the precision of the floating-point constants for the division operator.
;
; 2024/2/4, by ccb
;
cmp dword ptr vfpa_sys9147_data,00h
je Label847642
sub esp , 08h
fld qword ptr [ edi + 8 ]
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 Label847640
and edx,80000000h
test edx,edx
jne Label847640
mov edx,0
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fadd qword ptr [ 8 * edx + esi ]
pop esi
ELSE
fadd qword ptr [ 8 * edx + offset Data922438 ]
ENDIF
mov edx,0Ah
IFDEF RAX
push esi
lea esi , dword ptr [ Data922438 ]
fadd qword ptr [ 8 * edx + esi ]
pop esi
ELSE
fadd qword ptr [ 8 * edx + offset Data922438 ]
ENDIF
fistp dword ptr [ esp ]
mov edx,dword ptr vfpa_sys9204_data
sub edx,dword ptr [ esp ]
cmp edx,0
jl Label847641
cmp edx,dword ptr vfpa_sys9204_data
jg Label847641
cmp edx,eax
jle Label847641
cmp dword ptr vfpa_sys9181_data,eax
jle Label847641
mov eax,edx
cmp eax,dword ptr vfpa_sys9181_data
jle Label847641
mov eax,dword ptr vfpa_sys9181_data
jmp Label847641
Label847640 ::
fstp st(0)
mov edx,dword ptr vfpa_sys9204_data
cmp edx,eax
jle Label847641
cmp dword ptr vfpa_sys9181_data,eax
jle Label847641
mov eax,edx
mov bl,01h
mov byte ptr [ edi + 17 ],bl
cmp eax,dword ptr vfpa_sys9181_data
jle Label847641
mov eax,dword ptr vfpa_sys9181_data
mov bl,01h
mov byte ptr [ edi + 17 ],bl
jmp Label847641
Label847641 ::
fstp st(0)
add esp , 08h
jmp Label847642
Label847642 ::
cmp eax , 012h ;0x00847642 : 83f812
jl Label84764c ;0x00847645 : 7c05
mov eax , 012h ;0x00847647 : b812000000
Label84764c ::
fld qword ptr [ edi + 8 ] ;0x0084764c : dd4708
sub esp , 08h ;0x0084764f : 83ec08
fstp qword ptr [ esp ] ;0x00847652 : dd1c24
mov byte ptr [ edi + 18 ] , al ;0x00847655 : 884712
call _finite ;0x00847658 : ff15ec789100
add esp , 08h ;0x0084765e : 83c408
test eax , eax ;0x00847661 : 85c0
je Label84771b ;0x00847663 : 0f84b2000000
fld qword ptr [ Data91fbc8 ] ;0x00847669 : dd05c8fb9100
fld qword ptr [ edi + 8 ] ;0x0084766f : dd4708
fucompp ;0x00847672 : dae9
fstsw ax ;0x00847674 : dfe0
test byte ptr ah , 044h ;0x00847676 : f6c444
jnp Label84771b ;0x00847679 : 0f8b9c000000
fld qword ptr [ edi + 8 ] ;0x0084767f : dd4708
fabs ;0x00847682 : d9e1
fldlg2 ;0x00847684 : d9ec
fxch st(1) ;0x00847686 : d9c9
fyl2x ;0x00847688 : d9f1
fcom qword ptr [ Data91fbc8 ] ;0x0084768a : dc15c8fb9100
fstsw ax ;0x00847690 : dfe0
test byte ptr ah , 01h ;0x00847692 : f6c401
jne Label8476ae ;0x00847695 : 7517
sub esp , 08h ;0x00847697 : 83ec08
fstp qword ptr [ esp ] ;0x0084769a : dd1c24
call floor ;0x0084769d : ff15a0799100
fadd qword ptr [ Data921e20 ] ;0x008476a3 : dc05201e9200
add esp , 08h ;0x008476a9 : 83c408
jmp Label8476b6 ;0x008476ac : eb08
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_vfp9fix305.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_vfp9fix259.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix260.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix303.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix304.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
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|