0

次のコードは、exp() 関数を使用して確率を計算する while ループ内にあります。ループの7回目の反復でプログラムへの入力が何であれ、expはnanを返します。

  if(new<=old){
     coloring[random_node]=random_color;
  }else{
     proba=exp((-(new-old))/temperature);
     /*assert(!isnan(proba));*/
     printf("proba == %.50f\n",proba);
     if(random_percent(proba)){
            coloring[random_node]=random_color;
     }
  }

以下は、ループ内の 6 回目と 7 回目の反復のデバッグ情報です。

Breakpoint 1, graph_coloring_local_search (objectiveValue=50, N=50, E=350, edge_list=0x804d170, node_list=0x804dc68, maxIterations=100, 
initial_temperature=7) at coloring.c:391
391             proba=exp((-(new-old))/temperature);
(gdb) p new 
$21 = 1
(gdb) p old
$22 = 0
(gdb) p temperature 
$23 = 6.9992999999999999
(gdb) p -(new-old)/temperature 
$24 = -0.14287143000014288
(gdb) p ((double(*)())exp)(-(new-old)/temperature)
$25 = 0.8668655146301385
(gdb) c
Continuing.
proba == 0.86686551463013850060690401733154430985450744628906

Breakpoint 1, graph_coloring_local_search (objectiveValue=50, N=50, E=350, edge_list=0x804d170, node_list=0x804dc68, maxIterations=100, 
initial_temperature=7) at coloring.c:391
391             proba=exp((-(new-old))/temperature);
(gdb) p new 
$26 = 1
(gdb) p old
$27 = 0
(gdb) p temperature 
$28 = 6.9992999999999999
(gdb) p -(new-old)/temperature
$29 = -0.14287143000014288
(gdb) p ((double(*)())exp)(-(new-old)/temperature)
$30 = -nan(0x8000000000000)
(gdb) c
Continuing.
proba == -nan

どちらの場合も、使用される変数の値はまったく同じです。

4

1 に答える 1