Emm*_*mma 6 precision matlab printf exponent
我正在使用fprintf
Matlab中的命令将数据写入输出文本文件.如何写一个数字输出文件,例如1.12345678e-001
,在指数三位数?
formatSpec = '%1.8e\n';
Run Code Online (Sandbox Code Playgroud)
给出1.12345678e-01
,而不是期望的结果!
但按照给出的说明没有解决问题!
您可以使用此非正则表达式方法:
num = 0.112345678
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d', num/10^pow, pow)
ans =
1.12345678e-001
Run Code Online (Sandbox Code Playgroud)
对于多个输入,使用此:
num= [.123 .456 .789];
pow = floor(log10(abs(num)));
sprintf('%.8fe%+.3d ', [num./10.^pow; pow])
Run Code Online (Sandbox Code Playgroud)
不知道这是否属于类别下的解决方案或变通,但这里有云:
x = .123e25; % example number
formatSpec = '%1.8e\n'; % format specification
s = sprintf(formatSpec, x); % "normal" sprintf
pat = '(?<=e)[+-]\d+'; % regex pattern to detect exponent
s = regexprep(s, pat, sprintf('%+04i', str2double(regexp(s, pat ,'match')))); % zero-pad
Run Code Online (Sandbox Code Playgroud)
它使用正则表达式来标识指数子字符串,并将其替换为零填充到三位数的指数.正指数包括加号,如同fprintf
.
这不是最干净的答案,但你可以做这样的事情.基本步骤按原样写入,使用正则表达式获取指数,重写该部分,然后替换.
formatSpec = '%1.8e'
tempStr = sprintf(formatSpec,1.12345678e-1);
oldExp = regexp(tempStr,'e[+-]([0-9]+)$','tokens');
newExp = num2str(str2double(oldExp{1}{1}),'%03d');
fixedStr = regexprep(tempStr,[oldExp{1}{1} '$'],newExp)
Run Code Online (Sandbox Code Playgroud)
这输出:
fixedStr =
1.12345678e-001
Run Code Online (Sandbox Code Playgroud)