2016-08-19 6 views
0

OpenAI Gymに参加するために、強化学習のCプログラムhttps://webdocs.cs.ualberta.ca/~sutton/book/code/pole.cをPythonに適用しようとしています。私は別のテストプログラムにget_box機能をコピーした:私はscratch.cを呼び出す予期せぬ結果をもたらすいくつかの条件文を含むCコード

#include <stdio.h> 

int get_box(float x, float x_dot, float theta, float theta_dot); 

int main() { 

    int box; 
    box = get_box(0.01, 0.01, 0.01, 0.01); 

    printf("The value of box is : %x\n", box); 

    return 0; 
} 

#define one_degree 0.0174532 /* 2pi/360 */ 
#define six_degrees 0.1047192 
#define twelve_degrees 0.2094384 
#define fifty_degrees 0.87266 

int get_box(x,x_dot,theta,theta_dot) 
float x,x_dot,theta,theta_dot; 
{ 
    int box=0; 

    if (x < -2.4 || 
     x > 2.4 || 
     theta < -twelve_degrees || 
     theta > twelve_degrees)   return(-1); /* to signal failure */ 

    if (x < -0.8)    box = 0; 
    else if (x < 0.8)    box = 1; 
    else        box = 2; 

    if (x_dot < -0.5)    ; 
    else if (x_dot < 0.5)    box += 3; 
    else       box += 6; 

    if (theta < -six_degrees)   ; 
    else if (theta < -one_degree)  box += 9; 
    else if (theta < 0)    box += 18; 
    else if (theta < one_degree)   box += 27; 
    else if (theta < six_degrees)  box += 36; 
    else       box += 45; 

    if (theta_dot < -fifty_degrees) ; 
    else if (theta_dot < fifty_degrees) box += 54; 
    else         box += 108; 

    return(box); 
} 

。私はgcc scratch.c -lmでこのプログラムをコンパイルし./a.outでそれを実行すると、私は次の印刷出力を得る:

The value of box is : 55 

を私は条件文を通過する場合は、手動でI = 1 + 3 + 27 + 54を得ることを期待します85、これは私のPythonプログラムでも得られます。なぜプログラムは55を印刷しますか?

+4

これは難読化コンテストへの提出ですか?問題の多くは、特有のインデントスタイルにあります。 – Bathsheba

+0

#大文字ではない値を定義する、条件文の後ろに括弧を入れない、if/else ifに複数の条件がある場合、すべての条件の周りに括弧を入れない...そのコードを理解したい。 – Tim

+0

古いスタイルのK&R関数定義は 'float'パラメータをサポートしていませんでした。代わりに 'double'パラメータが渡され、その後キャストされました。プロトタイプで 'double'の代わりに' float'を使用すると、未定義の動作になります。 – a3f

答えて

3

printf("%x\n", box)の代わりにprintf("%d\n", box)を入力すると、10進値が出力されます。 0x55 = 5 * 16 + 5 = 85

-1

出力が16進数に変換されるためです。 55を10進数に変換すると、85に相当します。

関連する問題