【发布时间】: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