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を印刷しますか?
これは難読化コンテストへの提出ですか?問題の多くは、特有のインデントスタイルにあります。 – Bathsheba
#大文字ではない値を定義する、条件文の後ろに括弧を入れない、if/else ifに複数の条件がある場合、すべての条件の周りに括弧を入れない...そのコードを理解したい。 – Tim
古いスタイルのK&R関数定義は 'float'パラメータをサポートしていませんでした。代わりに 'double'パラメータが渡され、その後キャストされました。プロトタイプで 'double'の代わりに' float'を使用すると、未定義の動作になります。 – a3f