【发布时间】:2020-12-27 01:51:19
【问题描述】:
我已经尝试将这个看起来很简单的函数转换为 dart 已经有好几个星期了。我有在 Dart 中工作的函数,但它返回错误的结果。我尝试了不同的变化和策略来找出问题所在。我只是对VBA一无所知,所以很难。也许如果我可以将打印语句放入 VBA 代码并查看每个阶段打印的内容,那么也许我可以进一步推断,但我不知道如何执行此操作或如何阅读打印语句(比如我在哪里阅读它们?) .有人可以帮我解决这个问题或帮助我制定调试策略吗?我最后一次尝试是只使用常规 Excel 函数并使用单元格来保存值,最终结果是我在 Dart 中得到的确切结果!所以这进一步混淆了事情。我知道 VBA 代码给出了正确的答案,因为带有实际数学函数的书说 VBA 代码给出了正确的结果,但 Dart 代码(显然只是试图使用常规 Excel 函数和单元格)给出了错误的结果。
这是 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 屏幕截图:
代码=CND(-0.3253) 在带有 VBA 代码的 Excel 中返回 。在 Dart 中,代码 cnd(-0.3253); 返回 0.4140535951706531,这与图像中显示的函数的 Excel 表示形式给出的结果相同。怎么回事?
【问题讨论】:
-
不熟悉 Dart,但是在 VBA 中,求幂的优先级高于求反,所以
-10^2/2=>-50。 Dartpow函数很可能等同于 VBA(-10)^2/2=>+50 -
好的,谢谢。这是 pow 函数的问题!