-3

我需要帮助将此 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
4

1 回答 1

3

非常简单,让我们一步一步看:

=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;
于 2015-09-04T23:44:37.830 回答