← Back to context

Comment by adrian_b

10 hours ago

I would not call a "non-standard arithmetic convention" that ln(0) = -∞.

This is the standard convention when doing operations in the extended real number line, i.e. in the set of the real numbers completed with positive and negative infinities.

When the overflow exception is disabled, any modern CPU implements the operations with floating-point numbers as operations in the extended real number line.

So in computing this convention has been standard for more than 40 years, while in mathematics it has been standard for a couple of centuries or so.

As always in mathematics, when computing expressions, i.e. when computing any kind of function, you must be aware very well which are the sets within which you operate.

If you work with real numbers (i.e. in a computer you enable the FP overflow exception), then ln(0) is undefined. However, if you work with the extended real number line, which is actually the default setting in most current programming languages, then ln(0) is well defined and it is -∞.

Apparently Python throws an exception. This surprised me, I expected it to only throw for integers. Throwing for floats is weird and unsafe.

    >>> import math
    >>> math.log(0.0)
    Traceback (most recent call last):
      File "<python-input-2>", line 1, in <module>
        math.log(0.0)
        ~~~~~~~~^^^^^
    ValueError: expected a positive input, got 0.0

though if you use numpy floats you only get a warning:

    >>> import numpy as np
    >>> np.log(np.float64(0))
    <python-input-1>:1: RuntimeWarning: divide by zero encountered in log
    np.float64(-inf)

JavaScript works as expected:

    > Math.log(0.0)
    -Infinity
    > Math.log(-0.0)
    -Infinity
    > Math.log(-0.1)
    NaN