Next: Predicates on Numbers, Previous: Integer Basics, Up: Numbers [Contents][Index]

### 3.2 Floating-Point Basics

Floating-point numbers are useful for representing numbers that are not integral. The range of floating-point numbers is the same as the range of the C data type `double` on the machine you are using. On all computers currently supported by Emacs, this is double-precision IEEE floating point.

The read syntax for floating-point numbers requires either a decimal point, an exponent, or both. Optional signs (‘`+`’ or ‘`-`’) precede the number and its exponent. For example, ‘`1500.0`’, ‘`+15e2`’, ‘`15.0e+2`’, ‘`+1500000e-3`’, and ‘`.15e4`’ are five ways of writing a floating-point number whose value is 1500. They are all equivalent. Like Common Lisp, Emacs Lisp requires at least one digit after any decimal point in a floating-point number; ‘`1500.`’ is an integer, not a floating-point number.

Emacs Lisp treats `-0.0` as numerically equal to ordinary zero with respect to `equal` and `=`. This follows the IEEE floating-point standard, which says `-0.0` and `0.0` are numerically equal even though other operations can distinguish them.

The IEEE floating-point standard supports positive infinity and negative infinity as floating-point values. It also provides for a class of values called NaN, or “not a number”; numerical functions return such values in cases where there is no correct answer. For example, `(/ 0.0 0.0)` returns a NaN. Although NaN values carry a sign, for practical purposes there is no other significant difference between different NaN values in Emacs Lisp.

Here are read syntaxes for these special floating-point values:

infinity

  ‘`1.0e+INF`’ and ‘`-1.0e+INF`’

not-a-number

  ‘`0.0e+NaN`’ and ‘`-0.0e+NaN`’

The following functions are specialized for handling floating-point numbers:

Function: isnan x

  This predicate returns `t` if its floating-point argument is a NaN, `nil` otherwise.

Function: frexp x

  This function returns a cons cell `(s . e)`, where s and e are respectively the significand and exponent of the floating-point number x.

  If x is finite, then s is a floating-point number between 0.5 (inclusive) and 1.0 (exclusive), e is an integer, and x = s * 2**e. If x is zero or infinity, then s is the same as x. If x is a NaN, then s is also a NaN. If x is zero, then e is 0.

Function: ldexp s e

  Given a numeric significand s and an integer exponent e, this function returns the floating point number s * 2**e.

Function: copysign x1 x2

  This function copies the sign of x2 to the value of x1, and returns the result. x1 and x2 must be floating point.

Function: logb x

  This function returns the binary exponent of x. More precisely, the value is the logarithm base 2 of |x|, rounded down to an integer.

      (logb 10)
           ⇒ 3
      (logb 10.0e20)
           ⇒ 69

Next: Predicates on Numbers, Previous: Integer Basics, Up: Numbers [Contents][Index]