octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

VAX<-->IEEE 32bit float conversion


From: John W. Eaton
Subject: VAX<-->IEEE 32bit float conversion
Date: Thu, 22 Jul 2004 16:27:51 -0400

You are correct that there is just one 4-byte VAX floating point
format.  Octave should call this VAX_F, not VAX_D and VAX_G.  OTOH, I
think the Matlab data file format only includes options for D and G.

In any case, I don't think the conversion can be as simple as your
code suggests.  The format described here

  http://h18009.www1.hp.com/fortran/docs/unix-um/dfumcompat.htm#index_x_3983

looks like this:

   31        16   15    14       7 6        0
  |   fraction | sign  | exponent | fraction |
 

  * Bit 15 is the sign bit (0 for positive numbers, 1 for negative numbers).

  * Bits 14:7 are a binary exponent in excess 128 notation (binary
    exponents from --127 to 127 are represented by binary 1 to 255).

  * Bits 6:0 and 31:16 are a normalized 24-bit fraction with the
    redundant most significant fraction bit not represented.

It looks like your code does not account for the fact that there are
only 7 bits in the first part of the fraction.  Or am I missing
something?  Perhaps it worked for you because of the particular range
of values you used for testing?

Please note that I've moved this discussion to the maintainers list.

Thanks,

jwe


On  1-Jun-2004, Wolfgang Westphal <address@hidden> wrote:

| Hi!
| 
| I had to read some data files containing float values in VAX notation, 
| so I've implemented the conversion for 32bit VAX floats to IEEE little 
| endian. AFAIK for the 32bit case there's no difference between "VAX-D" 
| and "VAX-G", so the conversion is identical in both cases.
| 
| The attached patch is tested in octave 2.1.50 as well as octave 2.1.57, 
| and worksforme.
| 
| Regards,
| Wolfgang Westphal
| --- liboctave/data-conv.cc    2002-04-10 02:39:51.000000000 +0200
| +++ liboctave/data-conv.cc    2004-05-31 13:10:14.000000000 +0200
| @@ -277,15 +277,26 @@
|  }
|  
|  static void
| -VAX_D_float_to_IEEE_little_float (float * /* d */, int /* len */)
| +VAX_D_float_to_IEEE_little_float (float * d, int len)
|  {
| -  gripe_data_conversion ("VAX D float", "IEEE little endian format");
| +  for (int i=0;i<len;i++) {
| +    char* c = (char*)(&d[i]);
| +    swap_bytes(c, 0, 2);
| +    swap_bytes(c, 1, 3);
| +    c[3]--;
| +  }
|  }
|  
|  static void
| -VAX_G_float_to_IEEE_little_float (float * /* d */, int /* len */)
| -{
| -  gripe_data_conversion ("VAX G float", "IEEE little endian format");
| +VAX_G_float_to_IEEE_little_float (float * d , int len )
| +{
| +  char* c;
| +  for (int i=0;i<len;i++) {
| +    c = (char*)(&d[i]);
| +    swap_bytes(c, 0, 2);
| +    swap_bytes(c, 1, 3);
| +    c[3]--;
| +  }
|  }
|  
|  static void
| @@ -367,9 +378,14 @@
|  }
|  
|  static void
| -IEEE_little_float_to_VAX_D_float (float * /* d */, int /* len */)
| +IEEE_little_float_to_VAX_D_float (float * d , int len)
|  {
| -  gripe_data_conversion ("IEEE little endian", "VAX D");
| +  for (int i=0;i<len;i++) {
| +    char* c = (char*)(&d[i]);
| +    c[3]++;
| +    swap_bytes(c, 0, 2);
| +    swap_bytes(c, 1, 3);
| +  }
|  }
|  
|  static void
| @@ -415,9 +431,14 @@
|  }
|  
|  static void
| -IEEE_little_float_to_VAX_G_float (float * /* d */, int /* len */)
| +IEEE_little_float_to_VAX_G_float (float * d , int len)
|  {
| -  gripe_data_conversion ("IEEE little endian", "VAX G");
| +  for (int i=0;i<len;i++) {
| +    char* c = (char*)(&d[i]);
| +    c[3]++;
| +    swap_bytes(c, 0, 2);
| +    swap_bytes(c, 1, 3);
| +  }
|  }
|  
|  static void



reply via email to

[Prev in Thread] Current Thread [Next in Thread]