When you do calculations with arbitrary‐precision numbers, as discussed in "Arbitrary‐Precision Numbers", the Wolfram Language always keeps track of the precision of your results, and gives only those digits which are known to be correct, given the precision of your input. When you do calculations with machine‐precision numbers, however, the Wolfram Language always gives you a machine‐precision result, whether or not all the digits in the result can, in fact, be determined to be correct on the basis of your input.
The fact that you can get spurious digits in machine‐precision numerical calculations with the Wolfram Language is in many respects quite unsatisfactory. The ultimate reason, however, that the Wolfram Language uses fixed precision for these calculations is a matter of computational efficiency.
The Wolfram Language is usually set up to insulate you as much as possible from the details of the computer system you are using. In dealing with machine‐precision numbers, you would lose too much, however, if the Wolfram Language did not make use of some specific features of your computer.
The important point is that almost all computers have special hardware or microcode for doing floating‐point calculations to a particular fixed precision. The Wolfram Language makes use of these features when doing machine‐precision numerical calculations.
The typical arrangement is that all machine‐precision numbers in the Wolfram Language are represented as "double‐precision floating‐point numbers" in the underlying computer system. On most current computers, such numbers contain a total of 64 binary bits, typically yielding 16 decimal digits of mantissa.
The main advantage of using the built‐in floating‐point capabilities of your computer is speed. Arbitrary‐precision numerical calculations, which do not make such direct use of these capabilities, are usually many times slower than machine‐precision calculations.
There are several disadvantages of using built‐in floating‐point capabilities. One already mentioned is that it forces all numbers to have a fixed precision, independent of what precision can be justified for them.
A second disadvantage is that the treatment of machine‐precision numbers can vary slightly from one computer system to another. In working with machine‐precision numbers, the Wolfram Language is at the mercy of the floating‐point arithmetic system of each particular computer. If floating‐point arithmetic is done differently on two computers, you may get slightly different results for machine‐precision Wolfram Language calculations on those computers.
|$MachinePrecision||the number of decimal digits of precision|
|$MachineEpsilon||the minimum positive machine‐precision number which can be added to 1.0 to give a result distinguishable from 1.0|
|$MaxMachineNumber||the maximum machine‐precision number|
|$MinMachineNumber||the minimum positive machine‐precision number|
|$MaxNumber||the maximum magnitude of an arbitrary‐precision number|
|$MinNumber||the minimum magnitude of a positive arbitrary‐precision number|
Since machine‐precision numbers on any particular computer system are represented by a definite number of binary bits, numbers that are too close together will have the same bit pattern, and so cannot be distinguished. The parameter $MachineEpsilon gives the distance between 1.0 and the closest number that has a distinct binary representation.
Machine numbers have not only limited precision, but also limited magnitude. If you generate a number that is larger in magnitude than $MaxMachineNumber, the Wolfram Language will automatically convert the number to arbitrary‐precision form.
As of Version 11.3, if a machine-precision computation generates a number that is smaller in magnitude than $MinMachineNumber, the Wolfram Language will issue a warning. However, it will retain the result as a subnormal machine number that has leading zeros in its binary significand.