Jim,

You neglected to mention whether you're using the C++ backend or the Java
one.  Regardless, I think I've found your problem:

>    static def getDouble( reader: FileReader ) : Double throws 
IOException {
>       val byte0 = reader.read(); Console.OUT.printf(" %X\t", byte0);
        ^^^^^^^^^
The inferred type of byte0 is Int (since that's what reader.read() 
returns).

>       val ret1 = ( ((byte7&0xff)<<56) | ((byte6&0xff)<<48) | 
((byte5&0xff)<<40) | ((byte4 & 0xff)<<32) );
        ^^^^^^^^
Ditto for the inferred type of ret1 (since the whole expression is using
Ints).

>       return Double.fromLongBits((ret0|ret1) as Long);
                                               ^^^^^^^
This cast comes too late - the value has already been truncated by this
point.

I think the solution is to explicitly specify the type of byte0 through
byte7 as Long, like this:

>       val byte0: Long = reader.read(); Console.OUT.printf(" %X\t", 
byte0);

etc.

Any reason you are not using the Marshal approach I suggested earlier?
        Igor

Jim LaGrone <[email protected]> wrote on 08/11/2009 09:55:13 PM:

> I am having trouble reading values from a binary file. The file is 
> written in LSB order but X10 assumes MSB order. I have written methods 
> to compensate for this. The methods for shorts, ints, and floats work, 
> but I'm having trouble with the longs and doubles. Here is a test case.
> 
> Can someone verify this?
> 
> import x10.io.*;
> import x10.io.Console;
> 
> class ByteTester {
>    public static def main(args: Rail[String] ) {
>       val fileName = "double-x10file.bin";
>       write(fileName);
> 
>       //prints two floats -1.2251404E-32, 2.597222
>       floatReader(2, fileName);
> 
>       //should print double 1.111111100000000e+01 (or equiv)
>       doubleReader(1, fileName);
>       return;
>    }
> 
>    static def floatReader(n :Int, fileName: String ){
>       var reader: FileReader;
>       var i: Int = 0;
>       try{ 
>          reader = new FileReader( new File(fileName) );
>          for ( i = 0; i < n; i++ ){
>             val value = getFloat(reader);
>             Console.OUT.println( " -->\t" + value );
>          } 
>          reader.close(); 
>       }catch(e:Exception){
>          Console.OUT.println("OOOPS!!");
>          e.printStackTrace();
>       }
>       return i;
>    } 
> 
>    static def doubleReader(n :Int, fileName: String ){
>       var reader: FileReader;
>       var i: Int = 0;
>       try{ 
>          reader = new FileReader( new File(fileName) );
>          for ( i = 0; i < n; i++ ){
>             val value = getDouble(reader);
>             Console.OUT.println( " -->\t" + value );
>          } 
>          reader.close(); 
>       }catch(e:Exception){
>          Console.OUT.println("OOOPS!!");
>          e.printStackTrace();
>       }
>       return i;
>    } 
> 
>    /*writes 8 bytes*/
>    public static def write(fileName: String){
>       try{ 
>          var writer:FileWriter = new FileWriter( new File(fileName));
>          writer.writeByte(0xa3 as byte);
>          writer.writeByte(0x73 as byte);
>          writer.writeByte(0x7e as byte);
>          writer.writeByte(0x8a as byte);
> 
>          writer.writeByte(0xe3 as byte);
>          writer.writeByte(0x38 as byte);
>          writer.writeByte(0x26 as byte);
>          writer.writeByte(0x40 as byte);
>          writer.close();
>       }catch(e:Exception){
>          Console.OUT.println("OOOPS!!");
>          e.printStackTrace();
>       } 
>    }
> 
>    /* reads 8 bytes in MSB and converts to LSB incorrectly */
>    static def getDouble( reader: FileReader ) : Double throws 
> IOException {
>       val byte0 = reader.read(); Console.OUT.printf(" %X\t", byte0);
>       val byte1 = reader.read(); Console.OUT.printf(" %X\t", byte1);
>       val byte2 = reader.read(); Console.OUT.printf(" %X\t", byte2);
>       val byte3 = reader.read(); Console.OUT.printf(" %X\t", byte3);
>       val byte4 = reader.read(); Console.OUT.printf(" %X\t", byte4);
>       val byte5 = reader.read(); Console.OUT.printf(" %X\t", byte5);
>       val byte6 = reader.read(); Console.OUT.printf(" %X\t", byte6);
>       val byte7 = reader.read(); Console.OUT.printf(" %X\t", byte7);
> 
>       val ret1 = ( ((byte7&0xff)<<56) | ((byte6&0xff)<<48) | 
> ((byte5&0xff)<<40) | ((byte4 & 0xff)<<32) );
>        val ret0 = ( ((byte3&0xff)<<24) | ((byte2&0xff)<<16) | 
> ((byte1&0xff)<<8) | (byte0 & 0xff) );
>       return Double.fromLongBits((ret0|ret1) as Long);
>    }
> 
>    /* reads 4 bytes in MSB and converts to LSB correctly */
>    static def getFloat( reader: FileReader ) :Float throws IOException {
>       val byte0 = reader.read(); Console.OUT.printf(" %X \t",byte0);
>       val byte1 = reader.read(); Console.OUT.printf(" %X \t",byte1);
>       val byte2 = reader.read(); Console.OUT.printf(" %X \t",byte2);
>       val byte3 = reader.read(); Console.OUT.printf(" %X \t",byte3);
>       val ret = ( ((byte3&0xff)<<24) | ((byte2&0xff)<<16) | 
> ((byte1&0xff)<<8) | (byte0 & 0xff) );
>       return Float.fromIntBits(ret);
>    }
> }
-- 
Igor Peshansky  (note the spelling change!)
IBM T.J. Watson Research Center
XJ: No More Pain for XML's Gain (http://www.research.ibm.com/xj/)
X10: Parallel Productivity and Performance (http://x10.sf.net/)


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
X10-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/x10-users

Reply via email to