Task

Write two equal-sized numerical arrays 'x' and 'y' to
a two-column text file named 'filename'.

The first column of the file contains values from an 'x'-array with a
given 'xprecision', the second -- values from 'y'-array with 'yprecision'.

For example, considering:

   x = {1, 2, 3, 1e11};
   y = {1, 1.4142135623730951, 1.7320508075688772, 316227.76601683791}; 
                                                          /* sqrt(x) */
   xprecision = 3;
   yprecision = 5;

The file should look like:

   1    1
   2    1.4142
   3    1.7321
   1e+011   3.1623e+005

This task is intended as a subtask for Measure relative performance of sorting algorithms implementations.




:- module write_float_arrays.
:- interface.
 
:- import_module io.
 
:- pred main(io::di, io::uo) is det.
:- implementation.
 
:- import_module float, list, math, string.
 
main(!IO) :-
    io.open_output("filename", OpenFileResult, !IO),
    (
        OpenFileResult = ok(File),
        X = [1.0, 2.0, 3.0, 1e11],
        list.foldl_corresponding(write_dat(File, 3, 5), X, map(sqrt, X), !IO),
        io.close_output(File, !IO)
    ;
        OpenFileResult = error(IO_Error),
        io.stderr_stream(Stderr, !IO),
        io.format(Stderr, "error: %s\n", [s(io.error_message(IO_Error))], !IO),
        io.set_exit_status(1, !IO)
    ).
 
:- pred write_dat(text_output_stream::in, int::in, int::in, float::in,
     float::in, io::di, io::uo) is det.
 
write_dat(File, XPrec, YPrec, X, Y, !IO) :-
    io.format(File, "%.*g\t%.*g\n", [i(XPrec), f(X), i(YPrec), f(Y)], !IO).