--------------------------------------------------------------------------------------------------------------- [BUG/PRB.] VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE DIVISION OPERATOR January 2025 --------------------------------------------------------------------------------------------------------------- CCB 1. BUG: There is a test program: *PROC testdivisionoperator ?STR(4/1000000,16,12) && Displays 0.000004000000 ?STR(4/10000000,16,12) && Displays 0.000000000000 WAIT RETURN * END OF PROC TESTDIVISIONOPERATOR. We think STR(4/10000000,16,12) will display 0.000000400000, but: ?STR(4/10000000,16,12) && Displays 0.000000000000 2. CAUSE: When VFP 9.0 and earlier versions calculate 4/10000000, it will set the precision of the result float number: n=3, eps = 0.5*10^(-(n+3)) = 5e-07 4/10000000 = 4e-07 < 5e-07, So 4/10000000 = 0. When VFP Advanced calculates 4/10000000, it will adjust the precision of the result float number to 15 valid digits: n=15, eps = 0.5*10^(-(n+3)) = 5e-18 So 4/10000000 = 4e-07 = 0.000000400000. 3. RESOLUTION: We can write some code to fix the BUG. Label4ff7ab :: push ecx ;0x004ff7ab : 51 push ebx ;0x004ff7ac : 53 push esi ;0x004ff7ad : 56 mov esi , dword ptr [ Data9370f0 ] ;0x004ff7ae : 8b35f0709300 sub esi , 02Ch ;0x004ff7b4 : 83ee2c push edi ;0x004ff7b7 : 57 lea ebx , dword ptr [ esi + 44 ] ;0x004ff7b8 : 8d5e2c push ebx ;0x004ff7bb : 53 lea edi , dword ptr [ esp + 16 ] ;0x004ff7bc : 8d7c2410 mov dword ptr [ Data9370f0 ] , esi ;0x004ff7c0 : 8935f0709300 call Fun420dd3 ;0x004ff7c6 : e80816f2ff test eax , eax ;0x004ff7cb : 85c0 jne Label4ff89c ;0x004ff7cd : 0f85c9000000 mov dword ptr [ Data93cc80 ] , eax ;0x004ff7d3 : a380cc9300 cmp byte ptr [esi] , 059h ;0x004ff7d8 : 803e59 je Label5908a3 ;0x004ff7db : 0f84c2100900 cmp byte ptr [ebx] , 059h ;0x004ff7e1 : 803b59 je Label5908a3 ;0x004ff7e4 : 0f84b9100900 mov eax , esi ;0x004ff7ea : 8bc6 call Fun53e878 ;0x004ff7ec : e887f00300 mov eax , ebx ;0x004ff7f1 : 8bc3 call Fun53e878 ;0x004ff7f3 : e880f00300 cmp byte ptr [esi] , 04Eh ;0x004ff7f8 : 803e4e jne Label59086b ;0x004ff7fb : 0f856a100900 cmp byte ptr [ebx] , 04Eh ;0x004ff801 : 803b4e jne Label59086b ;0x004ff804 : 0f8561100900 Label4ff80a :: fld qword ptr [ esi + 16 ] ;0x004ff80a : dd4610 fdiv qword ptr [ esi + 60 ] ;0x004ff80d : dc763c fstp qword ptr [ esi + 16 ] ;0x004ff810 : dd5e10 Label4ff813 :: mov ecx , dword ptr [ esi + 8 ] ;0x004ff813 : 8b4e08 test ecx , ecx ;0x004ff816 : 85c9 jne Label484dd0 ;0x004ff818 : 0f85b255f8ff mov eax , dword ptr [ esi + 52 ] ;0x004ff81e : 8b4634 test eax , eax ;0x004ff821 : 85c0 jne Label484dd0 ;0x004ff823 : 0f85a755f8ff xor edx , edx ;0x004ff829 : 33d2 Label4ff82b :: mov eax , dword ptr [ esi + 52 ] ;0x004ff82b : 8b4634 mov edi , dword ptr [ esi + 48 ] ;0x004ff82e : 8b7e30 mov ebx , dword ptr [ esi + 4 ] ;0x004ff831 : 8b5e04 sub edi , eax ;0x004ff834 : 2bf8 sub edi , ecx ;0x004ff836 : 2bf9 sub edi , edx ;0x004ff838 : 2bfa dec edi ;0x004ff83a : 4f add ebx , edi ;0x004ff83b : 03df cmp ecx , eax ;0x004ff83d : 3bc8 mov dword ptr [ esi + 4 ] , ebx ;0x004ff83f : 895e04 ja Label484dda ;0x004ff842 : 0f879255f8ff Label4ff848 :: mov ecx , dword ptr [ Data9370f8 ] ;0x004ff848 : 8b0df8709300 mov dword ptr [ esi + 8 ] , eax ;0x004ff84e : 894608 mov edx , dword ptr [ecx] ;0x004ff851 : 8b11 mov ecx , dword ptr [ edx + 0D8h ] ;0x004ff853 : 8b8ad8000000 add ecx , 02h ;0x004ff859 : 83c102 ; ; ---------------------------------------------------------------------------------------------------- ; VFP 9.0 FIX - ADJUST THE PRECISION OF THE FLOATING-POINT NUMBERS FOR THE DIVISION OPERATOR ; February 2024 ; ---------------------------------------------------------------------------------------------------- ; CCB ; ; Adjust the precision of the floating-point numbers for the division operator. ; ; 2024/2/4, by ccb ; cmp dword ptr vfpa_sys9035_data,00h je Label4ff85c sub esp , 08h fld qword ptr [ esi + 16 ] 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 Label4ff85a and edx,80000000h test edx,edx jne Label4ff85a 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,0Fh sub edx,dword ptr [ esp ] cmp edx,0 jl Label4ff85b cmp edx,0Fh jg Label4ff85b cmp edx,ecx jle Label4ff85b cmp dword ptr vfpa_sys9181_data,ecx jle Label4ff85b mov ecx,edx cmp ecx,dword ptr vfpa_sys9181_data jle Label4ff85b mov ecx,dword ptr vfpa_sys9181_data jmp Label4ff85b Label4ff85a :: fstp st(0) mov edx,0Fh cmp edx,ecx jle Label4ff85b cmp dword ptr vfpa_sys9181_data,ecx jle Label4ff85b mov ecx,edx mov ebx,01h mov dword ptr [ esi + 4 ],ebx cmp ecx,dword ptr vfpa_sys9181_data jle Label4ff85b mov ecx,dword ptr vfpa_sys9181_data mov ebx,01h mov dword ptr [ esi + 4 ],ebx jmp Label4ff85b Label4ff85b :: fstp st(0) add esp , 08h jmp Label4ff85c Label4ff85c :: cmp eax , ecx ;0x004ff85c : 3bc1 ja Label4ff862 ;0x004ff85e : 7702 mov eax , ecx ;0x004ff860 : 8bc1 Label4ff862 :: cmp eax , 012h ;0x004ff862 : 83f812 mov dword ptr [ esi + 8 ] , eax ;0x004ff865 : 894608 ja Label590950 ;0x004ff868 : 0f87e2100900 Label4ff86e :: mov eax , dword ptr [ esi + 8 ] ;0x004ff86e : 8b4608 mov edx , dword ptr [ esi + 4 ] ;0x004ff871 : 8b5604 xor ecx , ecx ;0x004ff874 : 33c9 test eax , eax ;0x004ff876 : 85c0 setne cl ;0x004ff878 : 0f95c1 add ecx , eax ;0x004ff87b : 03c8 add edx , ecx ;0x004ff87d : 03d1 mov eax , edx ;0x004ff87f : 8bc2 cmp eax , 028h ;0x004ff881 : 83f828 mov dword ptr [ esi + 4 ] , edx ;0x004ff884 : 895604 jnl Label59095c ;0x004ff887 : 0f8dcf100900 Label4ff88d :: mov dword ptr [ esi + 4 ] , eax ;0x004ff88d : 894604 mov eax , dword ptr [ esp + 12 ] ;0x004ff890 : 8b44240c test eax , eax ;0x004ff894 : 85c0 jne Label590966 ;0x004ff896 : 0f85ca100900 Label4ff89c :: pop edi ;0x004ff89c : 5f pop esi ;0x004ff89d : 5e pop ebx ;0x004ff89e : 5b pop ecx ;0x004ff89f : 59 ret ;0x004ff8a0 : 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_vfp9fix123.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_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_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 2, mzvfp.com: http://www.mzvfp.com/read.php?tid=106670 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |