[Date Index]
[Thread Index]
[Author Index]
Re: "FortranForm" for numbers?
*To*: mathgroup at smc.vnet.net
*Subject*: [mg4640] Re: "FortranForm" for numbers?
*From*: rubin at msu.edu (Paul A. Rubin)
*Date*: Thu, 22 Aug 1996 03:54:57 -0400
*Organization*: Michigan State University
*Sender*: owner-wri-mathgroup at wolfram.com
In article <4u9ihd$moj at dragonfly.wolfram.com>,
siegman at ee.stanford.edu (AES) wrote:
->
->Wanted:
->
->1) A simple way to put an option at the start of a notebook so that all
->output numbers (in Print, Write, TableForm, etc) will come out in
->something similar to Fortran format, e.g.
->
-> 4.56789E-7
->
->(I don't care much about the exact number of digits, or exactly where the
->decimal point ends up, and the exponent part can be skipped if not
->needed. Note that in mma FortranForm[1/7] comes out as 1/7 and not
->0.1429).
I was with you until you said "simple." :-)
Try defining the following functions:
Clear[ oForm, fForm ]
fForm[ x_ ] :=
StringJoin[
RealDigits[ x ] /.
{a_List, b_} :> ToString /@
Flatten[ {First[ a ], ".", Rest[ a ], "E", b - 1} ]
]
oForm[ x_Integer ] :=
fForm[ N[ x, Length[ IntegerDigits[ x ] ] ] ]
oForm[ x_Rational ] := fForm[ N[ x ] ]
oForm[ x_?NumberQ ] := fForm[ x ]
oForm[ x_ ] := x
SetAttributes[ oForm, Listable ]
The function oForm will convert integer, rational and real quantities to
Fortran-like notation, giving integers their full complement of significant
digits (no loss of accuracy), converting rationals to machine numbers with
default precision, and leaving the precision of other reals alone. It
should leave anything else unmolested. If you don't want to convert
integers, change the first part of the oForm definition to
oForm[ x_Integer ] := x.
Now, somewhere at the top of your notebook (after defining fForm and
oForm), add the line
$PrePrint = oForm;
which will cause all output to be passed through oForm ...
.. except output in a Print statement or in any kind of wrapper (such as
TableForm). You could extend the definition of oForm to have it commute
with each individual wrapper (e.g. TableForm), but it might be less hassle
just to type it in, as in
Print[ oForm[ Range[ 3 ] ] ]
or
TableForm[ oForm[ Range[ 3 ] ] ].
->
->2) I'd also like to understand why TableForm sometimes comes out with
->blank lines between each line of output and sometimes not, on the same
->table (and it's not due to word wrapping).
Just to annoy me - you're what the military would call "collateral damage."
:-)
Then again, it might be a rounding error in computing the number of elapsed
lines or somesuch.
-> And how to put multiple
->"sometable // TableForm ;" statements inside a Do loop and have them
->Print.
->
Do[ ...; Print[ TableForm[ sometable ] ]; Print[ TableForm[ someothertable
] ]; ..., {iterator} ] should work.
Paul
**************************************************************************
* Paul A. Rubin Phone: (517) 432-3509 *
* Department of Management Fax: (517) 432-1111 *
* Eli Broad Graduate School of Management Net: RUBIN at MSU.EDU *
* Michigan State University *
* East Lansing, MI 48824-1122 (USA) *
**************************************************************************
Mathematicians are like Frenchmen: whenever you say something to them,
they translate it into their own language, and at once it is something
entirely different. J. W. v. GOETHE
==== [MESSAGE SEPARATOR] ====
Prev by Date:
**--->What is the problem with 'ParametricPlot'?**
Next by Date:
**Help: Professional vd student versions of Mma 2.2.3**
Previous by thread:
**"FortranForm" for numbers?**
Next by thread:
**Windows fonts (v2.2.2 & 2.2.3)**
| |