【问题标题】:Troubles with Translating a VBA Function to Dart将 VBA 函数转换为 Dart 的问题
【发布时间】: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。 Dart pow 函数很可能等同于 VBA (-10)^2/2 => +50
  • 好的,谢谢。这是 pow 函数的问题!

标签: excel vba flutter dart


【解决方案1】:

如果 VBA 结果是正确的,你的 Dart 代码应该是这样的:

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

【讨论】:

  • 感激不尽。你刚刚改变了我的生活!我希望你的生活得到祝福!
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多