quadruplet.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "quadruplet.hpp"
  2. void fpe_setrandom(fpe_t rop)
  3. {
  4. //zout(sizeof(*rop));
  5. //cout << abi::__cxa_demangle(typeid(rop->v[8]).name(), 0, 0, 0) << endl;
  6. bool tableau_entier[12]={}; /** Les shorts sont stockés sur 2 octets ne provoquent pas d'overflow après 10000 tests. Les ints sur 4 octets provoquent des overflows lorsqu'on multiplie les fpe_t entre eux. La mantisse des doubles est limitée à 53 bits. Les fpe_t sont associées à 12 doubles. On peut aussi générer des ints, puis faire un modulo pour voir la taille maximale. Avec cette méthode, on a pas d'overflow avec un modulo 2<<22-1. Autrement dit, le résultat fait moins de 22 bits soit moins de 2,75 octets. Edit : On a remplacé les shorts par des bools (3 occurences dans le fichier) pour diminuer la taille des coefficients qui faisaient parfois 256 bits et empêchent un décodage L2 correct. **/
  7. FILE * urandom;
  8. urandom = fopen ("/dev/urandom","r");
  9. if (urandom == NULL)
  10. {
  11. fprintf(stderr, "Could not open device file /dev/urandom");
  12. exit(1);
  13. }
  14. #ifdef CHECK
  15. for (int i=0; i<12;i++)
  16. {
  17. fread(&tableau_entier[i],sizeof(bool),1,urandom);
  18. (rop->v[i]).v=(double)tableau_entier[i];
  19. (rop->v[i]).mmax = (unsigned long long)fabs((double)tableau_entier[i]);
  20. }
  21. #else
  22. for (int i=0; i<12;i++)
  23. {
  24. fread(&tableau_entier[i],sizeof(bool),1,urandom);
  25. rop->v[i]=(double)tableau_entier[i]; // version sans DCHECK, équivalent (*rop).v[i]
  26. //zout(log(abs(rop->v[i]))/log(2));
  27. }
  28. #endif
  29. //fpe_print(stdout,rop);
  30. //cout << endl;
  31. //log2_fpe_print(stdout,rop);
  32. //cout << endl;
  33. fclose (urandom);
  34. }
  35. void fpe_ad_minus_bc(fpe_t rop,fpe_t op1,fpe_t op2,fpe_t op3) //(i_1,j_1,k_1,l_1); // rop*op3- op1*op2 = i1*l1 - j1*k1=1 on calcule i1 = (j1*k1 + 1)*l1^(-1)
  36. {
  37. if (fpe_iszero(op3)==1) //1=vrai
  38. {
  39. fpe_setrandom(rop); //rop quelconque
  40. fpe_t temp;
  41. fpe_invert(temp,op1);
  42. fpe_neg(op2,temp); //op2 = - (1/op1)
  43. cout << "op2=k1 modifié car op3=l1 vaut 0" << endl;
  44. //fpe_print(stdout,op2);
  45. //cout << endl;
  46. //log2_fpe_print(stdout,op2);
  47. //cout << endl;
  48. }
  49. else
  50. {
  51. fpe_t temp1, temp2, temp3, temp4;
  52. fpe_mul(temp1,op1,op2);
  53. fpe_setone(temp2);
  54. fpe_add(temp3,temp1,temp2);
  55. fpe_invert(temp4,op3);
  56. fpe_mul(rop,temp3,temp4);
  57. }
  58. /** affichage de rop=i1 **/
  59. //fpe_print(stdout,rop);
  60. //cout << endl;
  61. //log2_fpe_print(stdout,rop);
  62. //cout << endl;
  63. /** verifions que ad-bc = 1 **/
  64. fpe_t temp5,temp6,temp7;
  65. fpe_mul(temp5,rop,op3);
  66. fpe_mul(temp6,op1,op2);
  67. fpe_sub(temp7,temp5,temp6);
  68. //cout << "i1*l1 - j1*k1" << endl;
  69. //fpe_print(stdout,temp7);
  70. //jump;
  71. }
  72. // Print the bitsize of the element to stdout:
  73. void log2_fpe_print(FILE * outfile, const fpe_t op)
  74. {
  75. int i;
  76. for(i=0;i<11;i++)
  77. {
  78. fprintf(outfile, "%d, ", int(ceil(log2(fabs(todouble(op->v[i]))))));
  79. }
  80. fprintf(outfile, "%d\n", int(ceil(log2(fabs(todouble(op->v[11]))))));
  81. }