【问题标题】:Matlab - fprintf precision format issuesMatlab - fprintf 精度格式问题
【发布时间】:2016-11-28 18:57:13
【问题描述】:

我一直在尝试使用 MATLAB 以确定的格式将某些值保存在文本文件中。例如,我需要将数字 85 存储为 .85E+2(实际上是 .85D+2,RINEX 格式)。但我只能获得8.5E+1。

那么,如何将值存储为 .XXXE+n?

fileID = fopen('Rinexn.txt','w');
fprintf(fileID,' %0.13e', eph.IODE_sf3);
fclose(fileID);

【问题讨论】:

  • RINEX 把标志放在哪里?

标签: matlab printf


【解决方案1】:

你可以使用这个方法:

num = 85;
pow = floor(log10(abs(num)))+1;
sprintf('%.3fE%+d', num/10^pow, pow)

或者在你的情况下:

pow = floor(log10(abs(eph.IODE_sf3)))+1;
fprintf(fileID,'%.3fE%+d', eph.IODE_sf3/10^pow, pow );

【讨论】:

    【解决方案2】:

    基于 rahnema1 的回答,但更符合问题中指定的格式(正好 3 个有效数字,没有前导零,D 作为求幂字符):

    signs = {'+' '-'};
    pow   = floor(log10(abs(N))) + 1;
    fprintf(fileID,...
            '%s.%dD%+d\n', ...
             signs{(sign(N) < 0) + 1}, ...
             round(abs(N)/10^(pow-3)),...
             pow);
    

    N 是您的电话号码。如果您不希望将明确的 + 用于正值,请从单元格中删除 +

    signs = {' ' '-'};
    

    为了高效/方便的矢量化(N 是一个矢量):

    Ns = [signs((sign(N) < 0) + 1)
          num2cell(round(abs(N(:).') ./ 10.^(pow(:).'-3)))
          num2cell(pow(:)')];
    
    fprintf(fileID,...
            '%s.%dD%+d\n', ...
             Ns{:});
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多