现在已经有几周了,我试图将这种简单的功能转换为dart。我的函数在Dart中工作,但返回错误结果。我尝试了不同的变体和策略来找出问题所在。我只是不了解VBA,所以很难。也许如果我可以在VBA代码中放置打印语句并查看每个阶段打印的内容,那么也许可以进一步推断,但是我不知道如何执行此操作或如何读取打印语句(例如我在哪里读取它们?) 。有人可以帮我解决这个问题,还是可以帮我调试策略?我最后的尝试是仅使用常规Excel函数并使用单元格保存值,最终结果是我在Dart中获得的确切结果!因此,这进一步混淆了事情。
这是VBA代码:
Function CND(X As Double) As Double
Dim y As Double, Exponential As Double, SumA As Double, SumB As Double
y = Abs(X)
If y > 37 Then
CND = 0
Else
Exponential = Exp(-y ^ 2 / 2)
If y < 7.07106781186547 Then
SumA = 3.52624965998911E-02 * y + 0.700383064443688
SumA = SumA * y + 6.37396220353165
SumA = SumA * y + 33.912866078383
SumA = SumA * y + 112.079291497871
SumA = SumA * y + 221.213596169931
SumA = SumA * y + 220.206867912376
SumB = 8.83883476483184E-02 * y + 1.75566716318264
SumB = SumB * y + 16.064177579207
SumB = SumB * y + 86.7807322029461
SumB = SumB * y + 296.564248779674
SumB = SumB * y + 637.333633378831
SumB = SumB * y + 793.826512519948
SumB = SumB * y + 440.413735824752
CND = Exponential * SumA / SumB
Else
SumA = y + 0.65
SumA = y + 4 / SumA
SumA = y + 3 / SumA
SumA = y + 2 / SumA
SumA = y + 1 / SumA
CND = Exponential / (SumA * 2.506628274631)
End If
End If
If X > 0 Then CND = 1 - CND
End Function
这是Dart函数:
double cnd (double x) {
double y;
double exponential;
double sumA;
double sumB;
double value;
y = x.abs();
if (y > 37) {
value = 0;
} else {
exponential = exp(pow(-y, 2) / 2);
if (y < 7.07106781186547) {
sumA = 3.52624965998911E-02 * y + 0.700383064443688;
sumA = sumA * y + 6.37396220353165;
sumA = sumA * y + 33.912866078383;
sumA = sumA * y + 112.079291497871;
sumA = sumA * y + 221.213596169931;
sumA = sumA * y + 220.206867912376;
sumB = 8.83883476483184E-02 * y + 1.75566716318264;
sumB = sumB * y + 16.064177579207;
sumB = sumB * y + 86.7807322029461;
sumB = sumB * y + 296.564248779674;
sumB = sumB * y + 637.333633378831;
sumB = sumB * y + 793.826512519948;
sumB = sumB * y + 440.413735824752;
value = exponential * (sumA / sumB);
} else {
sumA = y + 0.65;
sumA = y + 4 / sumA;
sumA = y + 3 / sumA;
sumA = y + 2 / sumA;
sumA = y + 1 / sumA;
value = exponential / (sumA * 2.506628274631);
}
}
if (x > 0) {
value = 1 - value;
}
return value;
}
这是我仅使用Excel函数和单元格的尝试的Excel屏幕截图:
该代码在Excel中随VBA代码一起=CND(-0.3253)
返回。在Dart中,代码cnd(-0.3253);
返回0.4140535951706531,这与该函数的Excel表示给出的结果相同,如图中所示。到底是怎么回事?
如果VBA结果正确,则您的Dart代码可能应显示为:
exponential = exp(-pow(y, 2) / 2);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句