如何在VBA Excel中保持高小数精度

时间:2017-08-11 15:29:36

标签: excel vba excel-vba fortran fortran77

我正在转换一个至少保持16位小数精度的FORTRAN代码。 我面临着在VBA excel中除以零的问题,但是如果我在this online compiler上尝试下面的代码,我就不会得到零。 任何帮助表示赞赏。提前致谢。

这是fortran Code

program sum
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
x = 3.14159265358979
y = 1.24325643454325

z = (x*y)/dtan(0.0D0) 
print *, datan(.04D0*z)
end program sum

这是VBA代码

Public Function dosomething()
Dim X As Double
Dim Y As Double
Dim Z As Double
X = 3.14159265358979
Y = 1.24325643454325
Z = (X * Y) / Tan(0#)
End Function

2 个答案:

答案 0 :(得分:1)

 select  Date_Contract,
    contract,
    status, 
    min(date_Contract) over(partition by contract, status) 
    from table1;

Z = (X * Y) / Tan(0#) 字面上的类型提示是多余的,0函数需要Tan并返回Double。但是Double会返回Tan(0),因此 除以0

似乎你的在线Fortran编译器正在做一些时髦的事情。

  

它不应该是零,它应该是棕褐色(1E-16)

没有。这在数学上是错误的,VBA正在做对。如果您需要VBA代码与Fortran一样破碎,那么您需要明确处理这种情况:

0

但只知道这在数学上是错误的。我不知道Fortran代码如何设法输出Z = (X * Y) / Tan(1E-16) 。此VBA代码输出1.5707963267948966

答案 1 :(得分:1)

不会涉及太多细节,Fortran可以支持+/- Infinity和NaN的实际值(浮点数),具体取决于值的计算方式。例如,您的原始帖子包含两个未初始化的变量,然后您用它们来计算(v1 * v2)/dtan(0.0d0)。由于未初始化的变量通常(但不总是)设置为0,因此此计算变为0.0/0.0,在数学上未定义且结果为NaN 1

现在,如果分子是正数,z=(x*y)/dtan(0.0D0)会产生z=Infinity,无论xy是什么。如果你的系统不能代表Infinity,那么它使用“非常大的数字”。这显然是VBA的情况。

最后,您计算datan(.04D0*z)。在数学上,这是 arctangent(无穷大)= PI / 2 。同样,正确计算的Fortran结果与此匹配,返回双精度值1.57079632679490 2

现在,我对VBA了解不多,但它似乎不支持+/- Infinity或NaN。如果“非常大的数字”导致与您在最终结果中所期望的相比出现重大错误,则会出现this SO question所述的解决方法。

1 请注意,在具有双精度的Fortran中,您应该获得dtan(0.0d0) = 0.000000000000000E+000

2 为了在Fortran xy变量中保持双精度,必须追加d0。否则它们将默认变为单精度值,并且仅存储原始赋值中的前7个sig figs,并且由编译器决定双精度值中的剩余数字(通常只是垃圾)。