我来自硬件背景,基本上我在verilog中编码。我的目标是生成一堆随机浮点数,执行添加等基本操作,并将输入和输出保存到文件中。这是我的方法。
void PrintDoubleAsCBytes(double d, FILE* f)
{
f = fopen("testcases.txt","a");
unsigned char a[sizeof(d)];
unsigned i;
memcpy(a, &d, sizeof(d));
for (i = 0; i < sizeof(a); i++){
fprintf(f, "%0*X", (CHAR_BIT + 3) / 4, a[sizeof(d)-1-i]);
}
fprintf(f,"\n");
fclose(f); /*done!*/
}
int main (int argc, char *argv)
{
int limit = 500 ;
double a, b,c,d,e,f;
double a1, b1,c1,d1,e1,f1;
double result1;
double result;
int i,j ;
printf("limit = %d", limit );
srand(time(NULL));
for (i= 0 ; i< limit;i++)
{
c= rand();
d= rand();
e= rand();
f= rand();
a = c*d;
b = e*f;
result = a + b;
printf ("A= %f B = %f\n",a,b);
printf ("result= %f\n",result);
PrintDoubleAsCBytes(a, stdout); puts("");
PrintDoubleAsCBytes(b, stdout); puts("");
PrintDoubleAsCBytes(result, stdout); puts("");
}
for (j= 0 ; j< limit;j++)
{
c1= rand();
d1= rand();
e1= rand();
f1= rand();
a1 = c1/d1;
b1 = e1/f1;
result1 = a1 + b1;
printf ("A= %f B = %f\n",a1,b1);
printf ("result= %f\n",result1);
PrintDoubleAsCBytes(a1, stdout); puts("");
PrintDoubleAsCBytes(b1, stdout); puts("");
PrintDoubleAsCBytes(result1, stdout); puts("");
}
}
代码有效,但问题是这不是随机的。所以我从互联网上得到了一个随机数发生器
//n = (n * 6364136223846793005 + 1442695040888963407) & 0xFFFFFFFFFFFFFFFF;
#define MY_RAND_MAX 0xffffffffffffffffLL
/* the seed */
unsigned long long _myRandseed = 1;
unsigned long long int (myrand)(void)
{
_myRandseed = _myRandseed * 6364136223846793005 + 1442695040888963407;
return ((unsigned long long int) _myRandseed & MY_RAND_MAX);
}
void (mysrand) (unsigned long long int seed)
{
_myRandseed = seed;
}
我想生成A op B = Result。将A,B和Result放入文件中,并使用我的硬件验证值。 这个问题是我的第一个代码没有极值,rand()函数只有32位宽。所以我使用这个Knuth算法来达到这些极值,但我不知道如何将Knuth代码集成到我的代码中。我不知道第二个代码是如何工作的。请帮我把它整合到我的代码中。