Excel and the Math Coprocessor for DLLs
"Lynn McGuire" wrote:
Yes, I comprehended your explanation. And I understand
the difference between 64 bit precision and 80 bit
precision - that is what the _PC_64 flag is for.
Okay. You said you tried these combinations:
_control87( _PC_64+_RC_NEAR, _MCW_PC+_MCW_RC);
_control87 (_PC_64, _MCW_PC);
In both cases, you have selected 80-bit arithmetic (64-bit mantissa). And I
quite sure that Excel (VBA) uses _PC_64+_RC_NEAR.
So there is one combination that remains:
_control87(_PC_53+_RC_NEAR, _MCW_PC+_MCW_RC)
I believe that forces the FPU to round each result to 64-bit floating-point.
It might even restrict the FPU to 64-bit floating-point.
In either case, that might mimick this behavior in VBA: each pairwise
operation is rounded to 64-bit floating-point.
Sub testit3()
Const top As Double = 4195835#
Const bottom As Double = 3145727#
Dim chptst As Double
Dim divtwo As Double
divtwo = top / bottom
divtwo = divtwo * bottom
chptst = divtwo - top
MsgBox Format(chptst, "0.000E+00")
End Sub
In this case, chptst is exactly zero.
|