将VBA功能转换为Dart的问题

无限精灵1010

现在已经有几周了,我试图将这种简单的功能转换为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_ScreenShot

该代码在Excel中随VBA代码一起=CND(-0.3253)返回Excel_VBA_Result在Dart中,代码cnd(-0.3253);返回0.4140535951706531,这与该函数的Excel表示给出的结果相同,如图中所示。到底是怎么回事?

古斯塔夫

如果VBA结果正确,则您的Dart代码可能应显示为:

exponential = exp(-pow(y, 2) / 2);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章