Normalizing the E descriptor

8 次查看(过去 30 天)
I've created data files with Matlab using the E descriptor for the number format. This produces output of the form:
-1.0345359317572725e-002
1.0802940928336107e+000
However, a Fortran90 based code in which I need to load the data can't interpret this format. It expects to see numbers that are "Normalized," that is, the number is shifted over so that the first digit is in the tenths position. A leading zero and decimal are always present and a minus sign, if needed. For example, our above numbers need to be in the form:
-0.10345359317572725e-001
0.10802940928336107e+001
I've been trying to get the data into this format and have managed to do so in a script by converting the numbers to strings, doing the logic, and returning a cell of strings. However I am unable to write this data to a file without losing my format. Is there a simpler way to normalize the number format? Is there a way to write a cell array of strings to a regular file?

采纳的回答

Star Strider
Star Strider 2012-8-13
This does essentially what you want it to do. I didn't put it in a neat ‘function’ form because I'm not certain how you want to use it:
x = [pi; 10*pi; 100*pi; eps; -eps; 1/eps; realmax/10; realmin];
for k1 = 1:length(x)
if abs(x(k1)) >= 1
xpnt(k1) = fix(log10(abs(x(k1))))+1;
x1(k1) = x(k1)./(10.^(xpnt(k1)));
elseif abs(x(k1)) < 1
xpnt(k1) = fix(log10(abs(x(k1))));
x1(k1) = x(k1)./(10.^(xpnt(k1)));
end
fprintf(1,'\n%18.15fE%0+4d\n', x1(k1), xpnt(k1))
end
You can create formatted strings for each value of x by replacing the fprintf with sprintf and making the appropriate changes.
  2 个评论
Gregory Vernon
Gregory Vernon 2012-8-14
Thanks, this is what I was looking for. Was able to adapt to my needs, thanks.
Walter Roberson
Walter Roberson 2012-8-14
Are you sure your f90 compiler is standards compliant? The inputs do not need to be normalized for real f90.

请先登录,再进行评论。

更多回答(1 个)

Walter Roberson
Walter Roberson 2012-8-13
The normalization rule applies only to how output values are created, and does not apply to how input values must be presented.
Look at the standard at http://docs.oracle.com/cd/E19957-01/805-4939/z40007437a2e/index.html and search down to "E Editing" and from there look at the first example, which includes
CHARACTER L*40/'1234567E2 1234.67E-3 12.4567 '/
as a string that will be validly interpreted by an E format specifier. Notice the second number there includes an E exponent but is not normalized.

类别

Help CenterFile Exchange 中查找有关 Fortran with MATLAB 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by