代码之家  ›  专栏  ›  技术社区  ›  davidtbernal

尾数介于0和1之间的科学记数法的.NET格式说明符

  •  2
  • davidtbernal  · 技术社区  · 14 年前

    我正在使用一个fortran程序,该程序希望使用fortran输入浮点数。 E 格式说明符,这是科学符号,除非 尾数必须介于0和1之间 . 因此,而不是:

    "3147.3" --> "3.1473E3",
    

    它需要

    "3147.3" --> "0.31473E4".
    

    我无法修改Fortran程序,因为它与其他一些同样特殊的程序一起工作。

    似乎C# e 格式字符串会给出前者。是否有任何简单的方法来实现C中的后者?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Jeff Mercado    14 年前

    您可以这样指定自定义格式。

    var num = 3147.3;
    num.ToString("\\0.#####E0"); // "0.31473E4"
    
        2
  •  2
  •   M. S. B.    14 年前

    我认为你正在解决一个不存在的问题。确实,Fortran E的默认值 输出 说明符在小数点前有一个前导零(可以修改)。但当e说明符用于 输入 它非常宽容,不需要前导零——如果数字中有一个小数点,并且数字符合格式指定的列,那么它就可以工作了。

    下面是一个Fortran程序示例和一个输入文件示例。

    program test_format
    
    real :: num1, num2, num3
    
    open (unit=16, file="numbers_3.txt", status='old', access='sequential', form='formatted', action='read' ) 
    
    read (16, 1010 ) num1
    read (16, 1010 ) num2
    read (16, 1010 ) num3
    
    1010 format (E9.5)
    
    write (*, *) num1, num2, num3
    
    stop
    
    end program test_format
    

    以及三种不同情况下的样本输入:

    3.1473E3
    0.31473E4
    3147.3
    

    我用gfortran和intel ifort测试了这个程序。输出是:

     3147.300       3147.300       3147.300
    

    因此,在使用Fortran的E格式说明符执行输入时,小数点前的数字不必为零。甚至不需要输入值使用e符号!

    edit/p.s.i将程序转换为fortran 77的固定格式源代码布局,并用g77编译它——它可以很好地读取三个测试号。E格式对于输入的灵活性已经有很长一段时间了——可能是从Fortran IV开始,可能更长。

        3
  •  0
  •   schoetbi    14 年前

    float或double的表示在中定义 IEEE754 /IEC 60559:1989。您应该寻找库来提取尾数和指数。然后你可以直接除以然后移动到逗号,然后从指数中减去步数来形成你的解。

        4
  •  0
  •   Merlyn Morgan-Graham    14 年前

    您可以采用类似于Jeff M的解决方案的方法,并通过扩展方法实现:

    public static class DoubleExtensions
    {
        public static string ToFortranDouble(this double value)
        {
            return value.ToString("\\0.#####E0");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            string fortranValue = 3147.3.ToFortranDouble();
            System.Console.WriteLine(fortranValue);
        }
    }
    

    或者对于一些更复杂的东西(不确定Fortran浮点/双精度的精度):

    public static class DoubleExtensions
    {
        public static string ToFortranDouble(this double value)
        {
            return value.ToFortranDouble(4);
        }
    
        public static string ToFortranDouble(this double value, int precision)
        {
            return string.Format(value.ToString(
                string.Format("\\0.{0}E0", new string('#', precision))
                ));
        }
    }