I can answer that question, but I don't know that you mean to be doing the thing you're trying to do.
Most IPT tools assume that image data of class 'double' has a black value of 0 and a white value of 1. These are the values that are of importance when the data is rescaled/truncated when converting between classes. When you do your imwrite/imread routine, what's happening is that imwrite() gets fed an image of class 'double'. In order to scale the data to 'uint8', it's going to discard anything outside of [0 1] and rescale the remaining to fit [0 255]. You've truncated the data.
If this truncation is desired, then you can do it like this:
mydoublepic = rand(100)*1.2944-0.1472;
myuint8pic = im2uint8(mydoublepic);
If truncation is undesired, then the question becomes whether you want the output data to be 'uint8' at all, or whether you simply want it rescaled. If you want it to be 'uint8', then you'd have to scale it somehow to fit within [0 1] before casting. How exactly you do that would depend on what the image data means in context and how subsequent operations are going to expect it to be scaled/centered.
If you don't care what the output class is, you could just multiply im*255, but bear in mind that some tools wouldn't know what to do with an image of that class and data range.