我需要帮助将此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
例如,如果L9 = 2.6774且M9 = -79,7751,则结果值为271,9222(度数)。 Buyt我无法在端口 – guga
上实现这个结果您可以使用像radians *(180/M_PI)这样的公式将弧度转换为度数(这就是函数'DEGREES'的功能.C中没有这样的公式,但是您只是编写你自己的简单函数,'M_PI'常量在C语言的'math.h'中定义,并且是_PI_的值 –
您需要在问题中添加*您尝试的*。您的'c'代码看起来像 –