我正在转换一个至少保持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
答案 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
,无论x
和y
是什么。如果你的系统不能代表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 x
和y
变量中保持双精度,必须追加d0
。否则它们将默认变为单精度值,并且仅存储原始赋值中的前7个sig figs,并且由编译器决定双精度值中的剩余数字(通常只是垃圾)。