2015-09-04 115 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