Jump to content

User:CYRIS JUNIX FORTRAN ADFLICTI/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by CYRIS JUNIX FORTRAN ADFLICTI (talk | contribs) at 14:49, 30 May 2019 (FGH://WWW.NBM.QWK). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

Interval arithmetic

From Wikipedia, the free encyclopedia

 (Redirected from Fortran-SC) Jump to navigation Jump to search

This article has an unclear citation style. The references used may be made clearer with a different or consistent style of citation and footnoting. In some cases, only citation titles are provided. (June 2015) (Learn how and when to remove this template message)

Tolerance function (turquoise) and interval-valued approximation (red)

Interval arithmetic, interval mathematics, interval analysis, or interval computation, is a method developed by mathematicians since the 1950s and 1960s, as an approach to putting bounds on rounding errors and measurement errors in mathematical computation and thus developing numerical methods that yield reliable results. Very simply put, it represents each value as a range of possibilities. For example, instead of estimating the height of someone using standard arithmetic as 2.0 metres, using interval arithmetic we might be certain that that person is somewhere between 1.97 and 2.03 metres.

This concept is suitable for a variety of purposes. The most common use is to keep track of and handle rounding errors directly during the calculation and of uncertainties in the knowledge of the exact values of physical and technical parameters. The latter often arise from measurement errors and tolerances for components or due to limits on computational accuracy. Interval arithmetic also helps find reliable and guaranteed solutions to equations (such as differential equations) and optimization problems.

Mathematically, instead of working with an uncertain real we work with the two ends of the interval that contains . In interval arithmetic, any variable lies between and , or could be one of them. A function when applied to is also uncertain. In interval arithmetic produces an interval that is all the possible values for for all .

Contents

Introduction

The main focus of interval arithmetic is the simplest way to calculate upper and lower endpoints for the range of values of a function in one or more variables. These endpoints are not necessarily the supremum or infimum, since the precise calculation of those values can be difficult or impossible.

Treatment is typically limited to real intervals, so quantities of form

where and are allowed; with one of them infinite we would have an unbounded interval, while with both infinite we would have the extended real number line.

As with traditional calculations with real numbers, simple arithmetic operations and functions on elementary intervals must first be defined.[1] More complicated functions can be calculated from these basic elements.[1]

Example

Body Mass Index for a person 1.80 m tall in relation to body weight m (in kilograms)

Take as an example the calculation of body mass index (BMI). The BMI is the body weight in kilograms divided by the square of height in metres. A bathroom scale may have a resolution of one kilogram. We do not know intermediate values – about 79.6 kg or 80.3 kg – but information rounded to the nearest whole number. It is unlikely that when the scale reads 80 kg, someone really weighs exactly 80.0 kg. In normal rounding to the nearest value, the scales showing 80 kg indicates a weight between 79.5 kg and 80.5 kg. The relevant range is that of all real numbers that are greater than or equal to 79.5, while less than or equal to 80.5, or in other words the interval [79.5,80.5].

For a man who weighs 80 kg and is 1.80 m tall, the BMI is about 24.7. With a weight of 79.5 kg and the same height the value is 24.5, while 80.5 kilograms gives almost 24.9. So the actual BMI is in the range [24.5,24.9]. The error in this case does not affect the conclusion (normal weight), but this is not always the position. For example, weight fluctuates in the course of a day so that the BMI can vary between 24 (normal weight) and 25 (overweight). Without detailed analysis it is not possible to always exclude questions as to whether an error ultimately is large enough to have significant influence.

Interval arithmetic states the range of possible outcomes explicitly. Simply put, results are no longer stated as numbers, but as intervals that represent imprecise values. The size of the intervals are similar to error bars to a metric in expressing the extent of uncertainty. Simple arithmetic operations, such as basic arithmetic and trigonometric functions, enable the calculation of outer limits of intervals.

Simple arithmetic

Body mass index for different weights in relation to height L (in metres)

Returning to the earlier BMI example, in determining the body mass index, height and body weight both affect the result. For height, measurements are usually in round centimetres: a recorded measurement of 1.80 metres actually means a height somewhere between 1.795 m and 1.805 m. This uncertainty must be combined with the fluctuation range in weight between 79.5 kg and 80.5 kg. The BMI is defined as the weight in kilograms divided by the square of height in metre. Using either 79.5 kg and 1.795 m or 80.5 kg and 1.805 m gives approximately 24.7. But the person in question may only be 1.795 m tall, with a weight of 80.5 kilograms – or 1.805 m and 79.5 kilograms: all combinations of all possible intermediate values must be considered. Using the interval arithmetic methods described below, the BMI lies in the interval

An operation such as addition or multiplication, on two intervals is defined by

For the four basic arithmetic operations this can become

provided that is well-defined for all and .

For practical applications this can be simplified further:

where

The last case loses useful information about . So typically it is common to work with and as separate intervals.

Because several such divisions may occur in an interval arithmetic calculation, it is sometimes useful to do the calculation with so-called multi-intervals of the form

The corresponding multi-interval arithmetic maintains a disjoint set of intervals and also provides for overlapping intervals to unite.[2]:15

Since a real number can be interpreted as the interval intervals and real numbers can be freely and easily combined.

With the help of these definitions, it is already possible to calculate the range of simple functions, such as If for example, and it is clear

.

Interpreting this as a function of the variable with interval parameters and , then it is possible to find the roots of this function. It is then

the possible zeros are in the interval

Multiplication of positive intervals

As in the above example, the multiplication of intervals often only requires two multiplications. It is in fact

The multiplication can be seen as a destination area of a rectangle with varying edges. The result interval covers all levels from the smallest to the largest.

The same applies when one of the two intervals is non-positive and the other non-negative. Generally, multiplication can produce results as wide as for example if is squared. This also occurs, for example, in a division, if the numerator and denominator both contain zero.

Notation

To make the notation of intervals smaller in formulae, brackets can be used.

So we can use to represent an interval. For the set of all finite intervals, we can use

as an abbreviation. For a vector of intervals we can also use a bold font: .

Note that in such a compact notation, should not be confused between a so-called improper or single point interval and the lower and upper limit.

Elementary functions

Values of a monotonic function

Interval methods can also apply to functions that do not just use simple arithmetic, and we must also use other basic functions to redefine intervals, using already known monotonicity properties.

For monotonic functions in one variable, the range of values is also easy. If is monotonically increasing or decreasing in the interval then for all such that one of the following inequalities applies:

The range corresponding to the interval can be calculated by applying the function to its endpoints:

From this the following basic features for interval functions can easily be defined:

For even powers, the range of values being considered is important, and needs to be dealt with before doing any multiplication. For example, for should produce the interval when But if is taken by applying interval multiplication of form then the result appears to be wider than necessary.

Instead consider the function as a monotonically decreasing function for and a monotonically increasing function for So for even :

More generally, one can say that for piecewise monotonic functions it is sufficient to consider the endpoints of the interval , together with the so-called critical points within the interval being those points where the monotonicity of the function changes direction.

For the sine and cosine functions, the critical points are at or for all respectively. Only up to five points matter as the resulting interval is if the interval includes at least two extrema. For sine and cosine, only the endpoints need full evaluation as the critical points lead to easily pre-calculated values – namely -1, 0, +1.

Interval extensions of general functions

In general, it may not be easy to find such a simple description of the output interval for many functions. But it may still be possible to extend functions to interval arithmetic. If is a function from a real vector to a real number, then   is called an interval extension of if

.

This definition of the interval extension does not give a precise result. For example, both and are allowable extensions of the exponential function. Extensions as tight as possible are desirable, taking into the relative costs of calculation and imprecision; in this case should be chosen as it give the tightest possible result.

The natural interval extension is achieved by combining the function rule with the equivalents of the basic arithmetic and elementary functions.

The Taylor interval extension (of degree ) is a times differentiable function defined by

,

for some , where is the th order differential of at the point and is an interval extension of the Taylor remainder

Mean value form

The vector lies between and with , is protected by . Usually one chooses to be the midpoint of the interval and uses the natural interval extension to assess the remainder.

The special case of the Taylor interval extension of degree is also referred to as the mean value form. For an interval extension of the Jacobian we get

.

A nonlinear function can be defined by linear features.

Complex interval arithmetic

An interval can also be defined as a locus of points at a given distance from the centre, and this definition can be extended from real numbers to complex numbers.[3] As it is the case with computing with real numbers, computing with complex numbers involves uncertain data. So, given the fact that an interval number is a real closed interval and a complex number is an ordered pair of real numbers, there is no reason to limit the application of interval arithmetic to the measure of uncertainties in computations with real numbers.[4] Interval arithmetic can thus be extended, via complex interval numbers, to determine regions of uncertainty in computing with complex numbers.[4]

The basic algebraic operations for real interval numbers (real closed intervals) can be extended to complex numbers. It is therefore not surprising that complex interval arithmetic is similar to, but not the same as, ordinary complex arithmetic.[4] It can be shown that, as it is the case with real interval arithmetic, there is no distributivity between addition and multiplication of complex interval numbers except for certain special cases, and inverse elements do not always exist for complex interval numbers.[4] Two other useful properties of ordinary complex arithmetic fail to hold in complex interval arithmetic: the additive and multiplicative properties, of ordinary complex conjugates, do not hold for complex interval conjugates.[4]

Interval arithmetic can be extended, in an analogous manner, to other multidimensional number systems such as quaternions and octonions, but with the expense that we have to sacrifice other useful properties of ordinary arithmetic.[4]

Interval methods

This section needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.

Find sources: "Interval arithmetic" – news · newspapers · books · scholar · JSTOR (February 2018) (Learn how and when to remove this template message)

The methods of classical numerical analysis can not be transferred one-to-one into interval-valued algorithms, as dependencies between numerical values are usually not taken into account.

Rounded interval arithmetic

Outer bounds at different level of rounding

To work effectively in a real-life implementation, intervals must be compatible with floating point computing. The earlier operations were based on exact arithmetic, but in general fast numerical solution methods may not be available. The range of values of the function for and are for example . Where the same calculation is done with single digit precision, the result would normally be . But , so this approach would contradict the basic principles of interval arithmetic, as a part of the domain of would be lost. Instead, the outward rounded solution is used.

The standard IEEE 754 for binary floating-point arithmetic also sets out procedures for the implementation of rounding. An IEEE 754 compliant system allows programmers to round to the nearest floating point number; alternatives are rounding towards 0 (truncating), rounding toward positive infinity (i.e. up), or rounding towards negative infinity (i.e. down).

The required external rounding for interval arithmetic can thus be achieved by changing the rounding settings of the processor in the calculation of the upper limit (up) and lower limit (down). Alternatively, an appropriate small interval can be added.

Dependency problem

Approximate estimate of the value range

The so-called dependency problem is a major obstacle to the application of interval arithmetic. Although interval methods can determine the range of elementary arithmetic operations and functions very accurately, this is not always true with more complicated functions. If an interval occurs several times in a calculation using parameters, and each occurrence is taken independently then this can lead to an unwanted expansion of the resulting intervals.

Treating each occurrence of a variable independently

As an illustration, take the function defined by The values of this function over the interval are As the natural interval extension, it is calculated as:

which is slightly larger; we have instead calculated the infimum and supremum of the function over There is a better expression of in which the variable only appears once, namely by rewriting as addition and squaring in the quadratic

So the suitable interval calculation is

and gives the correct values.

In general, it can be shown that the exact range of values can be achieved, if each variable appears only once and if is continuous inside the box. However, not every function can be rewritten this way.

Wrapping effect

The dependency of the problem causing over-estimation of the value range can go as far as covering a large range, preventing more meaningful conclusions.

An additional increase in the range stems from the solution of areas that do not take the form of an interval vector. The solution set of the linear system

is precisely the line between the points and Using interval methods results in the unit square, This is known as the wrapping effect.

Linear interval systems

A linear interval system consists of a matrix interval extension and an interval vector . We want the smallest cuboid , for all vectors which there is a pair with and satisfying

.

For quadratic systems – in other words, for – there can be such an interval vector , which covers all possible solutions, found simply with the interval Gauss method. This replaces the numerical operations, in that the linear algebra method known as Gaussian elimination becomes its interval version. However, since this method uses the interval entities and repeatedly in the calculation, it can produce poor results for some problems. Hence using the result of the interval-valued Gauss only provides first rough estimates, since although it contains the entire solution set, it also has a large area outside it.

A rough solution can often be improved by an interval version of the Gauss–Seidel method. The motivation for this is that the -th row of the interval extension of the linear equation

can be determined by the variable if the division is allowed. It is therefore simultaneously

and .

So we can now replace by

,

and so the vector by each element. Since the procedure is more efficient for a diagonally dominant matrix, instead of the system one can often try multiplying it by an appropriate rational matrix with the resulting matrix equation

left to solve. If one chooses, for example, for the central matrix , then is outer extension of the identity matrix.

These methods only work well if the widths of the intervals occurring are sufficiently small. For wider intervals it can be useful to use an interval-linear system on finite (albeit large) real number equivalent linear systems. If all the matrices are invertible, it is sufficient to consider all possible combinations (upper and lower) of the endpoints occurring in the intervals. The resulting problems can be resolved using conventional numerical methods. Interval arithmetic is still used to determine rounding errors.

This is only suitable for systems of smaller dimension, since with a fully occupied matrix, real matrices need to be inverted, with vectors for the right hand side. This approach was developed by Jiri Rohn and is still being developed.[5]

Interval Newton method

Reduction of the search area in the interval Newton step in "thick" functions

An interval variant of Newton's method for finding the zeros in an interval vector can be derived from the average value extension.[6] For an unknown vector applied to , gives

.

For a zero , that is , and thus must satisfy

.

This is equivalent to . An outer estimate of can be determined using linear methods.

In each step of the interval Newton method, an approximate starting value is replaced by and so the result can be improved iteratively. In contrast to traditional methods, the interval method approaches the result by containing the zeros. This guarantees that the result produces all zeros in the initial range. Conversely, it proves that no zeros of were in the initial range if a Newton step produces the empty set.

The method converges on all zeros in the starting region. Division by zero can lead to separation of distinct zeros, though the separation may not be complete; it can be complemented by the bisection method.

As an example, consider the function , the starting range , and the point . We then have and the first Newton step gives

.

More Newton steps are used separately on and . These converge to arbitrarily small intervals around and .

The Interval Newton method can also be used with thick functions such as , which would in any case have interval results. The result then produces intervals containing .

Bisection and covers

Rough estimate (turquoise) and improved estimates through "mincing" (red)

The various interval methods deliver conservative results as dependencies between the sizes of different intervals extensions are not taken into account. However the dependency problem becomes less significant for narrower intervals.

Covering an interval vector by smaller boxes so that

is then valid for the range of values

So for the interval extensions described above the following holds:

Since is often a genuine superset of the right-hand side, this usually leads to an improved estimate.

Such a cover can be generated by the bisection method such as thick elements of the interval vector by splitting in the centre into the two intervals and If the result is still not suitable then further gradual subdivision is possible. Note that a cover of intervals results from divisions of vector elements, substantially increasing the computation costs.

With very wide intervals, it can be helpful to split all intervals into several subintervals with a constant (and smaller) width, a method known as mincing. This then avoids the calculations for intermediate bisection steps. Both methods are only suitable for problems of low dimension.

Application

Interval arithmetic can be used in various areas (such as set inversion, motion planning, set estimation or stability analysis) to treat estimates with no exact numerical value.[7]

Rounding error analysis

Interval arithmetic is used with error analysis, to control rounding errors arising from each calculation. The advantage of interval arithmetic is that after each operation there is an interval that reliably includes the true result. The distance between the interval boundaries gives the current calculation of rounding errors directly:

Error = for a given interval .

Interval analysis adds to rather than substituting for traditional methods for error reduction, such as pivoting.

Tolerance analysis

Parameters for which no exact figures can be allocated often arise during the simulation of technical and physical processes. The production process of technical components allows certain tolerances, so some parameters fluctuate within intervals. In addition, many fundamental constants are not known precisely.[2]

If the behavior of such a system affected by tolerances satisfies, for example, , for and unknown then the set of possible solutions

,

can be found by interval methods. This provides an alternative to traditional propagation of error analysis. Unlike point methods, such as Monte Carlo simulation, interval arithmetic methodology ensures that no part of the solution area can be overlooked. However, the result is always a worst-case analysis for the distribution of error, as other probability-based distributions are not considered.

Fuzzy interval arithmetic

Approximation of the normal distribution by a sequence of intervals

Interval arithmetic can also be used with affiliation functions for fuzzy quantities as they are used in fuzzy logic. Apart from the strict statements and , intermediate values are also possible, to which real numbers are assigned. corresponds to definite membership while is non-membership. A distribution function assigns uncertainty, which can be understood as a further interval.

For fuzzy arithmetic[8] only a finite number of discrete affiliation stages are considered. The form of such a distribution for an indistinct value can then represented by a sequence of intervals

The interval corresponds exactly to the fluctuation range for the stage

The appropriate distribution for a function concerning indistinct values and the corresponding sequences

can be approximated by the sequence

where

and can be calculated by interval methods. The value corresponds to the result of an interval calculation.

Computer-assisted proof

Warwick Tucker used interval arithmetic in order to solve the 14th of Smale's problems [9]

History

Interval arithmetic is not a completely new phenomenon in mathematics; it has appeared several times under different names in the course of history. For example, Archimedes calculated lower and upper bounds 223/71 < π < 22/7 in the 3rd century BC. Actual calculation with intervals has neither been as popular as other numerical techniques nor been completely forgotten.

Rules for calculating with intervals and other subsets of the real numbers were published in a 1931 work by Rosalind Cicely Young, a doctoral candidate at the University of Cambridge[10]. Arithmetic work on range numbers to improve the reliability of digital systems were then published in a 1951 textbook on linear algebra by Paul Dwyer (University of Michigan)[11]; intervals were used to measure rounding errors associated with floating-point numbers. A comprehensive paper on interval algebra in numerical analysis was published by Teruo Sunaga (1958).[12]

The birth of modern interval arithmetic was marked by the appearance of the book Interval Analysis by Ramon E. Moore in 1966.[13][14] He had the idea in Spring 1958, and a year later he published an article about computer interval arithmetic.[15] Its merit was that starting with a simple principle, it provided a general method for automated error analysis, not just errors resulting from rounding.

Independently in 1956, Mieczyslaw Warmus suggested formulae for calculations with intervals,[16] though Moore found the first non-trivial applications.

In the following twenty years, German groups of researchers carried out pioneering work around Götz Alefeld [de][17] and Ulrich Kulisch[1][18] at the University of Karlsruhe and later also at the Bergische University of Wuppertal. For example, Karl Nickel [de] explored more effective implementations, while improved containment procedures for the solution set of systems of equations were due to Arnold Neumaier among others. In the 1960s, Eldon R. Hansen dealt with interval extensions for linear equations and then provided crucial contributions to global optimisation, including what is now known as Hansen's method, perhaps the most widely used interval algorithm.[6] Classical methods in this often have the problem of determining the largest (or smallest) global value, but could only find a local optimum and could not find better values; Helmut Ratschek and Jon George Rokne developed branch and bound methods, which until then had only applied to integer values, by using intervals to provide applications for continuous values.

In 1988, Rudolf Lohner developed Fortran-based software for reliable solutions for initial value problems using ordinary differential equations.[19]

The journal Reliable Computing (originally Interval Computations) has been published since the 1990s, dedicated to the reliability of computer-aided computations. As lead editor, R. Baker Kearfott, in addition to his work on global optimisation, has contributed significantly to the unification of notation and terminology used in interval arithmetic (Web: Kearfott).

In recent years work has concentrated in particular on the estimation of preimages of parameterised functions and to robust control theory by the COPRIN working group of INRIA in Sophia Antipolis in France (Web: INRIA).

Implementations

There are many software packages that permit the development of numerical applications using interval arithmetic.[20] These are usually provided in the form of program libraries. There are also C++ and Fortran compilers that handle interval data types and suitable operations as a language extension, so interval arithmetic is supported directly.

Since 1967, Extensions for Scientific Computation (XSC) have been developed in the University of Karlsruhe for various programming languages, such as C++, Fortran and Pascal.[21] The first platform was a Zuse Z 23, for which a new interval data type with appropriate elementary operators was made available. There followed in 1976, Pascal-SC, a Pascal variant on a Zilog Z80 that it made possible to create fast, complicated routines for automated result verification. Then came the Fortran 77-based ACRITH-XSC for the System/370 architecture (FORTRAN-SC), which was later delivered by IBM. Starting from 1991 one could produce code for C compilers with Pascal-XSC; a year later the C++ class library supported C-XSC on many different computer systems. In 1997, all XSC variants were made available under the GNU General Public License. At the beginning of 2000 C-XSC 2.0 was released under the leadership of the working group for scientific computation at the Bergische University of Wuppertal to correspond to the improved C++ standard.

Another C++-class library was created in 1993 at the Hamburg University of Technology called Profil/BIAS (Programmer's Runtime Optimized Fast Interval Library, Basic Interval Arithmetic), which made the usual interval operations more user friendly. It emphasized the efficient use of hardware, portability and independence of a particular presentation of intervals.

The Boost collection of C++ libraries contains a template class for intervals. Its authors are aiming to have interval arithmetic in the standard C++ language.[22]

The Frink programming language has an implementation of interval arithmetic that handles arbitrary-precision numbers. Programs written in Frink can use intervals without rewriting or recompilation.

Gaol[23] is another C++ interval arithmetic library that is unique in that it offers the relational interval operators used in interval constraint programming.

The Moore library [24] is an efficient implementation of interval arithmetic in C++. It provides intervals with endpoints of arbitrary precision and is based on the ``concepts´´ feature of C++.

The Julia programming language[25] has an implementation of interval arithmetics along with high-level features, such as root-finding (for both real and complex-valued functions) and interval constraint programming, via the ValidatedNumerics.jl package.[26]

In addition computer algebra systems, such as Mathematica, Maple and MuPAD, can handle intervals. A Matlab extension Intlab builds on BLAS routines, and the Toolbox b4m makes a Profil/BIAS interface.[27] Moreover, the Software Euler Math Toolbox includes an interval arithmetic.

A library for the functional language OCaml was written in assembly language and C.[28]

IEEE Std 1788-2015 – IEEE standard for interval arithmetic

A standard for interval arithmetic has been approved in June 2015.[29] Two reference implementations are freely available.[30] These have been developed by members of the standard's working group: The libieeep1788[31] library for C++, and the interval package[32] for GNU Octave.

A minimal subset of the standard, IEEE Std 1788.1-2017, has been approved in December 2017 and published in February 2018. It should be easier to implement and may speed production of implementations[33].

Conferences and Workshop

Several international conferences or workshop take place every year in the world. The main conference is probably SCAN (International Symposium on Scientific Computing, Computer Arithmetic, and Verified Numerical Computation), but there is also SWIM (Small Workshop on Interval Methods), PPAM (International Conference on Parallel Processing and Applied Mathematics), REC (International Workshop on Reliable Engineering Computing).


Fortran 95 language features

From Wikipedia, the free encyclopedia Jump to navigation Jump to search

"Fortran language features" redirects here. For features of previous versions of the language, see Fortran § History.

This is an overview of Fortran 95 language features. Included are the additional features of TR-15581:Enhanced Data Type Facilities, that have been universally implemented. Old features that have been superseded by new ones are not described — few of those historic features are used in modern programs although most have been retained in the language to maintain backward compatibility. Although the current standard is Fortran 2008, even many of those features first introduced into Fortran 2003 are still being implemented.[1] The additional features of Fortran 2003 and Fortran 2008 are described by Metcalf, Reid and Cohen.[2][3]

Contents

Language elements

Fortran is case-insensitive. The convention of writing Fortran keywords in upper case and all other names in lower case is adopted in this article; except, by way of contrast, in the input/output descriptions (Data transfer and Operations on external files).

Basics

The basic component of the Fortran language is its character set. Its members are

  • the letters A ... Z and a ... z (which are equivalent outside a character context)
  • the numerals 0 ... 9
  • the underscore _
  • the special characters =  : + blank - * / ( ) [ ] , . $ ' ! "  % &  ; < >  ?

Tokens that have a syntactic meaning to the compiler are built from those components. There are six classes of tokens:

Label 123
Constant 123.456789_long
Keyword ALLOCATABLE
Operator .add.
Name solve_equation (up to 31 characters, including _)
Separator / ( ) (/ /) [ ] , = =>  :  ::  ;  %

From the tokens, statements are built. These can be coded using the new free source form which does not require positioning in a rigid column structure:

FUNCTION string_concat(s1, s2)                             ! This is a comment
   TYPE (string), INTENT(IN) :: s1, s2
   TYPE (string) string_concat
   string_concat%string_data = s1%string_data(1:s1%length) // &
      s2%string_data(1:s2%length)                          ! This is a continuation
   string_concat%length = s1%length + s2%length
END FUNCTION string_concat

Note the trailing comments and the trailing continuation mark. There may be 39 continuation lines, and 132 characters per line. Blanks are significant. Where a token or character constant is split across two lines:

               ...        start_of&
        &_name
               ...   'a very long &
        &string'

a leading & on the continued line is also required.

Automatic conversion of source form for existing programs can be carried out by [[1]].

Its options are

  • significant blank handling;
  • indentation;
  • CONTINUE replaced by END DO;
  • name added to subprogram END statement; and
  • INTEGER*2 etc. syntax converted.

Intrinsic data types

Fortran has five intrinsic data types: INTEGER, REAL, COMPLEX, LOGICAL and CHARACTER. Each of those types can be additionally characterized by a kind. Kind, basically, defines internal representation of the type: for the three numeric types, it defines the precision and range, and for the other two, the specifics of storage representation. Thus, it is an abstract concept which models the limits of data types' representation; it is expressed as a member of a set of whole numbers (e.g. it may be {1, 2, 4, 8} for integers, denoting bytes of storage), but those values are not specified by the Standard and not portable. For every type, there is a default kind, which is used if no kind is explicitly specified. For each intrinsic type, there is a corresponding form of literal constant. The numeric types INTEGER and REAL can only be signed (there is no concept of sign for type COMPLEX).

Literal constants and kinds

INTEGER

Integer literal constants of the default kind take the form

1   0   -999   32767   +10

Kind can be defined as a named constant. If the desired range is ±10kind, the portable syntax for defining the appropriate kind, two_bytes is

INTEGER, PARAMETER :: two_bytes = SELECTED_INT_KIND(4)

that allows subsequent definition of constants of the form

-1234_two_bytes   +1_two_bytes

Here, two_bytes is the kind type parameter; it can also be an explicit default integer literal constant, like

-1234_2

but such use is non-portable.

The KIND function supplies the value of a kind type parameter:

KIND(1)            KIND(1_two_bytes)

and the RANGE function supplies the actual decimal range (so the user must make the actual mapping to bytes):

RANGE(1_two_bytes)

Also, in DATA (initialization) statements, binary (B), octal (O) and hexadecimal (Z) constants may be used (often informally referred to as "BOZ constants"):

B'01010101'   O'01234567'   Z'10fa'
REAL

There are at least two real kinds—the default and one with greater precision (this replaces DOUBLE PRECISION). SELECTED_REAL_KIND functions returns the kind number for desired range and precision; for at least 9 decimal digits of precision and a range of 10−99 to 1099, it can be specified as:

INTEGER, PARAMETER :: long = SELECTED_REAL_KIND(9, 99)

and literals subsequently specified as

1.7_long

Also, there are the intrinsic functions

KIND(1.7_long)   PRECISION(1.7_long)   RANGE(1.7_long)

that give in turn the kind type value, the actual precision (here at least 9), and the actual range (here at least 99).

COMPLEX

COMPLEX data type is built of two integer or real components:

(1, 3.7_long)
LOGICAL

There are only two basic values of logical constants: .TRUE. and .FALSE.. Here, there may also be different kinds. Logicals don't have their own kind inquiry functions, but use the kinds specified for INTEGERs; default kind of LOGICAL is the same as of INTEGER.

.FALSE.   .true._one_byte

and the KIND function operates as expected:

KIND(.TRUE.)
CHARACTER

The forms of literal constants for CHARACTER data type are

'A string'   "Another"   'A "quote"'   '''''''

(the last being an empty string). Different kinds are allowed (for example, to distinguish ASCII and UNICODE strings), but not widely supported by compilers. Again, the kind value is given by the KIND function:

KIND('ASCII')

Number model and intrinsic functions

The numeric types are based on number models with associated inquiry functions (whose values are independent of the values of their arguments; arguments are used only to provide kind). These functions are important for portable numerical software:

DIGITS(X) Number of significant digits
EPSILON(X) Almost negligible compared to one (real)
HUGE(X) Largest number
MAXEXPONENT(X) Maximum model exponent (real)
MINEXPONENT(X) Minimum model exponent (real)
PRECISION(X) Decimal precision (real, complex)
RADIX(X) Base of the model
RANGE(X) Decimal exponent range
TINY(X) Smallest positive number (real)

Scalar variables

Scalar variables corresponding to the five intrinsic types are specified as follows:

INTEGER(KIND=2) :: i
REAL(KIND=long) :: a
COMPLEX         :: current
LOGICAL         :: Pravda
CHARACTER(LEN=20) :: word
CHARACTER(LEN=2, KIND=Kanji) :: kanji_word

where the optional KIND parameter specifies a non-default kind, and the :: notation delimits the type and attributes from variable name(s) and their optional initial values, allowing full variable specification and initialization to be typed in one statement (in previous standards, attributes and initializers had to be declared in several statements). While it is not required in above examples (as there are no additional attributes and initialization), most Fortran-90 programmers acquire the habit to use it everywhere.

LEN= specifier is applicable only to CHARACTERs and specifies the string length (replacing the older *len form). The explicit KIND= and LEN= specifiers are optional:

CHARACTER(2, Kanji) :: kanji_word

works just as well.

There are some other interesting character features. Just as a substring as in

CHARACTER(80) :: line   
... = line(i:i)                     ! substring

was previously possible, so now is the substring

'0123456789'(i:i)

Also, zero-length strings are allowed:

line(i:i-1)       ! zero-length string

Finally, there is a set of intrinsic character functions, examples being

ACHAR IACHAR (for ASCII set)
ADJUSTL ADJUSTR
LEN_TRIM INDEX(s1, s2, BACK=.TRUE.)
REPEAT SCAN(for one of a set)
TRIM VERIFY(for all of a set)

Derived data types

For derived data types, the form of the type must be defined first:

TYPE person
   CHARACTER(10) name
   REAL          age
END TYPE person

and then, variables of that type can be defined:

TYPE(person) you, me

To select components of a derived type, % qualifier is used:

you%age

Literal constants of derived types have the form TypeName(1stComponentLiteral, 2ndComponentLiteral, ...):

you = person('Smith', 23.5)