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

我正在转换FORTRAN代码保持至less16精度的小数。 我面临一个在VBA excel除零的问题,但如果我尝试在线编译器下面的代码,我不会得到一个零。 任何帮助表示赞赏。 提前致谢。

这是Fortran代码

program sum IMPLICIT DOUBLE PRECISION (AH,OZ) 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 

没有太多细节,Fortran可以支持+/- Infinity和NaN的实际值(浮点数),具体取决于计算值。 例如,您的原始文章包含两个未初始化的variables,然后用于计算(v1 * v2)/dtan(0.0d0) 。 由于未初始化的variables经常(但不总是)设置为0,所以这个计算变成0.0/0.0 ,这在math上是未定义的,结果是NaN1

现在,如果分子是正的,则z=(x*y)/dtan(0.0D0)导致z=Infinity ,而不pipexy是什么。 如果你的系统不能表示Infinity,那么它使用“非常大的数字”。 这显然是VBA的情况。

最后,你计算datan(.04D0*z) 。 在math上,这是反正切(无穷大)= PI / 2 。 再次,正确计算的Fortran结果与此匹配,返回双精度值1.570796326794902

现在,我不太了解VBA,但似乎并不支持+/- Infinity或NaN。 如果一个“非常大的数字”导致显着的错误比你最终的结果所期望的,那么看起来有这样的问题所述的变通办法。


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

2为了在Fortran xyvariables中保持双精度,您必须附加d0 。 否则,默认情况下,它们将变成单精度值,并且只存储来自原始赋值的前7个字符,而编译器在双精度值中剩下的数字是什么(通常只是垃圾)。

 Z = (X * Y) / Tan(0#) 

0字面上的types提示是多余的, Tan函数采用Double并返回Double 。 但是Tan(0)返回0 ,所以你除以0

看起来你的在线Fortran编译器正在做一些有趣的事情。

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

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

 Z = (X * Y) / Tan(1E-16) 

但只是知道这是math上的错误。 我不知道如何Fortran代码pipe理输出1.5707963267948966 。 这个VBA代码输出3.90580528128931E+16