【问题标题】:Converting Excel formula to C? [closed]将Excel公式转换为C? [关闭]
【发布时间】:2015-09-04 23:14:29
【问题描述】:

我需要帮助将此 Excel 公式转换为 C(使用纯 Win32 API,使用来自 msvcrt 的 atan2)。 Excel公式为:

=IF(AND(L9=0;M9=0);0;IF(M9>=0;DEGREES(ATAN2(L9;M9));DEGREES(ATAN2(L9;M9))+360))

我尝试移植它,但我不理解度数约定,因为值不匹配。

这个 Excel 公式对应的 C 函数是什么?


好的,我在这里编辑了答案。我成功地制作了一个与 excel 中的功能完全相同的功能。我是用汇编程序编写的(使用 RosAsm 汇编程序),但移植到 C 应该不难。

[Float_DoublePi: R$ (2*3.1415926535897932384626433832795028841971693993751058)]
[Float_180_Pi: R$ (3.1415926535897932384626433832795028841971693993751058/2)]
[ConvRadianToDegree: R$ (180/3.14159286)]
[FloatZero: R$ 0]

Proc ComputedH:
    Arguments @aFact, @bFact, @HFact
    Uses ebx, esi, ecx, edi, eax

    mov ebx D@aFact
    mov esi D@bFact
    mov edi D@HFact

    .Fpu_If_And R$ebx = R$FloatZero, R$esi = R$FloatZero
        fldz | fstp R$edi
    .Fpu_Else_If R$esi >= R$FloatZero
        Fpu_If R$ebx >= R$FloatZero
            fld R$Float_180_Pi
            C_call 'msvcrt.atan2' D$ebx, D$ebx+4, D$esi, D$esi+4
            fsubrp ST1 ST0 | fabs
        Fpu_Else
            fld R$Float_180_Pi
            C_call 'msvcrt.atan2' D$ebx, D$ebx+4, D$esi, D$esi+4
            fsubrp ST1 ST0 | fabs
        Fpu_End_If
    .Fpu_Else
        Fpu_If R$ebx >= R$FloatZero
            C_call 'msvcrt.atan2' D$esi, D$esi+4, D$ebx, D$ebx+4 | fadd R$Float_DoublePi
        Fpu_Else
            ; 360-X-(pi+pi/2) ==> 2PI-X-(pi+pi/2) = pi/2-X
            fld R$Float_180_Pi
            C_call 'msvcrt.atan2' D$ebx, D$ebx+4, D$esi, D$esi+4
            fsubrp ST1 ST0 | fabs
        Fpu_End_If
    .Fpu_End_If

    fmul R$ConvRadianToDegree |  fstp R$edi

EndP

【问题讨论】:

  • 例如,如果 L9 = 2.6774 且 M9 = -79,7751,则结果值为 271,9222(以度为单位)。 Buyt 我在尝试移植时无法达到这个结果
  • 您可以使用radians*(180/M_PI) 之类的公式将弧度转换为度数(这就是函数DEGREES 所做的事情。C 中没有这样的公式,但您只需根据该公式编写自己的简单函数。@ 987654325@常量在C语言的math.h中定义,是PI的值
  • 您需要在问题中添加您尝试过的内容。你的c 代码是什么样的。
  • 弧度度数为 k,反之亦然,但无法达到相同的结果。例如,当我输入输入值 92.6774 和 -79.7751 时,结果与 excel 中的不同。例如调用 atan2(2.6774,-79.7751)) = 178º,但是,假设我需要添加 360,resulatnt 值为 538 而不是 271.92

标签: c excel-formula atan2


【解决方案1】:

很简单,让我们一步一步看:

=IF(AND(L9=0;M9=0) // Check this condition
  ;0               // Do this if true
  ;IF(M9>=0        // Check this if false
      ;DEGREES(ATAN2(L9;M9))
      ;DEGREES(ATAN2(L9;M9))+360))

所以我们可以很容易地转换它:

double output; // our output angle

if (L9 == 0 && M9 == 0) {
    output = 0;
} else {
    if (M9 >= 0) {
        output = atan2(L9, M9);
    } else {
        output = atan2(L9, M9) + 2*PI;
    }
}
output *= 180/PI;

【讨论】:

  • 谢谢,我试试,比较结果
  • 谢谢,但仍然无法正常工作。如果 L9 = 2.6774 和 M9 = -79,7751,结果大约是 538º,但为什么在 excel 中结果值为 271,922 ???
  • 我想我成功地创建了一个与 excel 完全相同的函数。似乎excel适用于象限。而“+360”则反转“x,y”坐标并添加 2*PI。我在 asm 中为它构建了一个函数(使用 RosAsm 汇编器)。不知道如何将它移植到 C,但应该不难吃。
  • 不要知道如何将我为你们构建的功能放在这里:(
  • 谢谢大家。成功地制作了一个与 excel 完全相同的函数。编辑问题的主题并将答案放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多