IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 39423


Ignore:
Timestamp:
Mar 1, 2016, 11:40:20 AM (10 years ago)
Author:
eugene
Message:

sprintf_float,double return unsigned int (is strlen value); fix signed/unsigned inconsistencies; fix sprintf_float,double test to skip off-by-last digit errors

Location:
branches/eam_branches/ohana.20160226/src/libohana
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ohana.20160226/src/libohana/include/ohana.h

    r39409 r39423  
    486486int ohana_bisection_double (double *values, int Nvalues, double threshold);
    487487
    488 int sprintf_float (char *output, float value);
    489 int sprintf_double (char *output, double value);
     488unsigned int sprintf_float (char *output, float value);
     489unsigned int sprintf_double (char *output, double value);
    490490
    491491/* in gaussdev.c */
  • branches/eam_branches/ohana.20160226/src/libohana/src/sprintf_floats.c

    r39058 r39423  
    88
    99// returns the number of bytes written EXCLUDING the ending NULL char
    10 int sprintf_float (char *output, float value) {
     10unsigned int sprintf_float (char *output, float value) {
    1111
    1212  // I want a fast way to print a float in %e format.  Simplifying assumptions: print a
     
    117117
    118118// returns the number of bytes written EXCLUDING the ending NULL char
    119 int sprintf_double (char *output, double value) {
     119unsigned int sprintf_double (char *output, double value) {
    120120
    121121  // I want a fast way to print a float in %e format.  Simplifying assumptions: print a
  • branches/eam_branches/ohana.20160226/src/libohana/test/sprintf_floats.c

    r39058 r39423  
    77
    88void test_float (float value) {
    9   char output[128], string[128];
     9  char output[128], string[128], altout[128];
    1010
    11   int Noutput = sprintf_float(output, value);
     11  unsigned int Noutput = sprintf_float(output, value);
    1212  ok (Noutput == strlen(output), "right length");
    1313  sprintf (string, "%+14.7e", value);
    14   ok (!strcmp (output, string), "right format");
    1514
    16   if (strcmp (output, string)) {
    17     fprintf (stderr, "output: %s, string: %s\n", output, string);
     15  // due to rounding error (where?), the last digit may differ between sprintf and sprintf_float
     16  if (!strcmp (output, string)) {
     17    pass ("right format: %s, string: %s", output, string);
     18    return;
    1819  }
     20
     21  strcpy (altout, output);
     22  int Co = output[9] - '0';
     23  int Ci = string[9] - '0';
     24  int valid = (Co - 1 == Ci); // e.g., Co = 8, Ci = 9
     25  valid = valid || (Co + 1 == Ci); // e.g., Co = 8, Ci = 7
     26  valid = valid || ((Co == 0) && Ci == 9);  // e.g., Co = 0, Ci = 9
     27  valid = valid || ((Ci == 0) && Co == 9);  // e.g., Co = 9, Ci = 0
     28  if (!valid) {
     29    fail ("wrong format: %s, string: %s", output, string);
     30    return;
     31  }
     32  altout[9] = string[9];
     33  if ((Co == 0) && (Ci == 9)) {
     34    altout[8] = string[8];
     35  }
     36  if ((Co == 9) && (Ci == 0)) {
     37    altout[8] = string[8];
     38  }
     39  if (!strcmp (altout, string)) {
     40    pass ("fixed format: %s, string: %s", output, string);
     41  } else {
     42    fail ("wrong format: %s, string: %s", output, string);
     43  }
     44
    1945  return;
    2046}
    2147
    2248void test_double (double value) {
    23   char output[128], string[128];
     49  char output[128], string[128], altout[128];
    2450
    25   int Noutput = sprintf_double(output, value);
     51  unsigned int Noutput = sprintf_double(output, value);
    2652  ok (Noutput == strlen(output), "right length");
    2753  sprintf (string, "%+21.14e", value);
    28   ok (!strcmp (output, string), "right format");
    2954
    30   if (strcmp (output, string)) {
    31     fprintf (stderr, "output: %s, string: %s\n", output, string);
     55  // due to rounding error (where?), the last digit may differ between sprintf and sprintf_float
     56  if (!strcmp (output, string)) {
     57    pass ("right format: %s, string: %s", output, string);
     58    return;
    3259  }
     60
     61  strcpy (altout, output);
     62  int Co = output[16] - '0';
     63  int Ci = string[16] - '0';
     64  int valid = (Co - 1 == Ci); // e.g., Co = 8, Ci = 9
     65  valid = valid || (Co + 1 == Ci); // e.g., Co = 8, Ci = 7
     66  valid = valid || ((Co == 0) && Ci == 9);  // e.g., Co = 0, Ci = 9
     67  valid = valid || ((Ci == 0) && Co == 9);  // e.g., Co = 9, Ci = 0
     68  if (!valid) {
     69    fail ("wrong format: %s, string: %s", output, string);
     70    return;
     71  }
     72  altout[16] = string[16];
     73  if ((Co == 0) && (Ci == 9)) {
     74    altout[15] = string[15];
     75    fprintf (stderr, "last two digits .. ");
     76  }
     77  if ((Co == 9) && (Ci == 0)) {
     78    altout[15] = string[15];
     79    fprintf (stderr, "last two digits .. ");
     80  }
     81  if (!strcmp (altout, string)) {
     82    pass ("fixed format: %s, string: %s", output, string);
     83  } else {
     84    fail ("wrong format: %s, string: %s", output, string);
     85  }
     86
    3387  return;
    3488}
     
    4397  /*** sprint_float ***/
    4498  if (DO_FLOATS) {
    45     int Noutput;
     99    unsigned int Noutput;
    46100    char output[128];
    47101
     
    85139  /*** sprint_double ***/
    86140  if (DO_DOUBLES) {
    87     int Noutput;
     141    unsigned int Noutput;
    88142    char output[128];
    89143
Note: See TracChangeset for help on using the changeset viewer.