Am 01.07.2008 um 07:27 schrieb David Finlayson:

OK, I've got an object that can read int and uint for 8, 16, 24 and 32
bit numbers from a binary file stream. But I cant figure out how to
read a float or double. What I want is something like this (these
don't work):

double
        | n |
        n := Float from: (aFileStream next: 32).
        ^n

float
        | n |
        n := Float from: (aFileStream next: 16).
        ^n

Any tips?


Well, for one, C floats are 4 bytes and doubles are 8 bytes as defined by IEEE, so your code couldn't possibly work.

Secondly, Squeak Floats are represented as C doubles (inspect a Float, you will see two 32-bit words = 8 bytes), only in FloatArrays we have single-precision (32 bits = 4 bytes) floats that are converted to/from doubles on the fly when you access them.

You can see how to read/write Floats (doubles) in the readFloat:/ writeFloat: methods of DataStream. And to convert a Float into the bit pattern for singles there is Float>>asIEEE32BitWord and Float class>>fromIEEE32Bit:.

If speed was a concern you could use a FloatArray and set/get the 32 bit word using #basicAt:/#basicAt:put: for about a 3x speed-up.

- Bert -


_______________________________________________
Beginners mailing list
Beginners@lists.squeakfoundation.org
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to