21

浮動小数点計算を含む C プログラムの乱数発生器を知っている人はいますか?

Csmith が浮動小数点式を生成せず、他の多くの構成要素を生成するため、変更が少し難しくなることを除いて、Csmithに少し似ているものを探しています。逐次計算を生成することは、これらに浮動小数点計算が含まれている限り、私の目的にとっては良い出発点です。条件付きはさらに優れていますが、ループ、ポインター、さらには配列は必要ありません。

非常に多くの言語が C に似た構文を使用しているため、そのようなジェネレーターは C に固有のものである必要はないかもしれません。別の C に似た言語に固有のものであっても、その言語用に生成されたプログラムをテキスト処理して、 C プログラム。

編集: これは、私が探しているものを明確にするための Csmith で生成されたプログラムのスニペットです。

...
int64_t *l_374 = &g_189;
int32_t l_375 = (-1L);
int i, j, k;
l_375 &= ((g_106 == ((*l_374) = (&g_324[4] == l_373[0][0][5]))) < 0x80C8L);
return (*g_207);
...

また、Csmith プログラムを使用して、たとえばint64_t withで置換するとfloat、構文的に正しい C プログラムが得られる可能性がありますが、定義されたプログラムが得られることはほとんどないことも明確にする必要があります。置換されたプログラムに未定義の動作が含まれているかどうかをテストできますが、これは安価ではありません。また、置換されたプログラムの 99% を未定義であるという理由で拒否しなければならない場合、プロセスが遅すぎて役に立たなくなります。

4

2 に答える 2

3

私は小さな浮動小数点ファザーから始めました。今のところほとんど何もしていませんが、何かから始めなければなりません。

これは、SSE2 命令を生成するコンパイラを比較するための使用例です。異なる結果を生成する言い訳はないと私は主張します。

#include <stdio.h>
double x0 = 35945970.47e-83;
double x1 = (973e-37+(5626073.612783921311173024e-76*231.106261545926274055e1*66390306733994e-1*420514.99786508*654374994.1249111e-35*5201.6039804e56)+(2.93604195+33e-50)+(969222843.32046212043603+1734e01)+(0166605914e8+6701040019050623e-23+32591206968562.6e-11+90771798.753788905)+(328e-49/944642906580982081e7));

int main(){
  x0 = (((x1*534425399171e0)*(x1*x0*x0)*(x1*x0*57063248719.703555336277392e-36*x0*472e57*65189741246535e-1)*x1*(x1/22393742341e70)*(x1+x0+x0+x0))-((843193503867271987e3*61.949746266e23*x1*x1*x0)/(x1/x1)));
  x0 = ((x0+x1+x1+x1+x0)-(x0*506680.0005767722e66*396.650621163*70798334426455964.1*x1*305369e14));
  x1 = 660098705340e-21;
  printf("%a\n", x0);
}

このプログラムgccclang(このプラットフォームでは SSE2 命令を生成する) の場合、同じことを計算する実行可能ファイルを生成します。

~/genfloat $ gcc t.c ; ./a.out 
0x1.5c5a77a63c1d6p+430
~/genfloat $ clang t.c ; ./a.out 
0x1.5c5a77a63c1d6p+430

また、x87 命令でコンパイルされたプログラムで得られる可能性のあるすべての結果を予測することになっている静的アナライザーをテストするつもりであり、予測不可能な方法でいくつかの中間結果を倍精度のメモリ位置にスピルします。

~/genfloat $ frama-c -val -float-hex -all-rounding-modes t.c 
...
      x0 ∈ [0x1.5c5a77a63c1cap430 .. 0x1.5c5a77a63c1e8p430]

上記は、テストする必要がある強力な主張です。

于 2011-12-22T09:45:43.053 に答える
1

私のmanydl.cプログラムは、(整数に対して) 非常によく似た処理を行っています。ニーズに非常に簡単に適応させることができます。

私は、一部の人々、特にJacques Pitratに、Linux システムがdlopen非常に大量 (数十万以上) の共有オブジェクトを作成できること、そのプログラムがランダムな C コード (整数に焦点を当てたもの) を生成し、コンパイルしてコンパイルすることを納得させるための小さなハックとして書いたdlopen-s その後、それらの多くを実行します。浮動小数点のニーズに合わせて調整できます。私は、ランダムだが終了する C プログラムを生成するように設計したmanydl.cので、フロートに適応させることができます (私が行ったように、終了して安価な操作を選択するだけです)。

コーヒータイムでもっと聞いて

(私たちは親しい同僚なので)

于 2012-10-05T21:46:52.380 に答える