2015-09-04 164 views
-3

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

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

我试图移植它,但我不明白程度约定,因为值不匹配。

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


好的,我在这里编辑了答案。我完成了一个和excel中的函数完全一样的函数。我写汇编(使用汇编RosAsm),但它shouldn't很难移植到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 [email protected] 
    mov esi [email protected] 
    mov edi [email protected] 

    .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 
+0

例如,如果L9 = 2.6774且M9 = -79,7751,则结果值为271,9222(度数)。 Buyt我无法在端口 – guga

+0

上实现这个结果您可以使用像radians *(180/M_PI)这样的公式将弧度转换为度数(这就是函数'DEGREES'的功能.C中没有这样的公式,但是您只是编写你自己的简单函数,'M_PI'常量在C语言的'math.h'中定义,并且是_PI_的值 –

+0

您需要在问题中添加*您尝试的*。您的'c'代码看起来像 –

回答

2

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

=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; 
+0

谢谢,我会试一试,然后比较结果 – guga

+0

谢谢,但窗台不工作。如果L9 = 2.6774和M9 = -79,7751,结果约为538º,但为什么在excel中结果值是271,922? – guga

+0

我想我会创建一个适用于excel的函数。似乎excel在象限中起作用。而“+360”则颠倒了“x,y”坐标并添加了2 * PI。我为它构建了一个函数(使用RosAsm汇编器)。不知道如何将它移植到C,但它不应该很难吃饱。 – guga