Project

General

Profile

Actions

Feature #10255

open

Math.log: check domain of base argument

Added by gogotanaka (Kazuki Tanaka) about 10 years ago. Updated almost 10 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:65101]

Description

I suppose Math.log with base 0 or 1 is undefinable or has no meaning, so I think it should be raise Math::DomainError

It is helpful to prevent unnecessary concern or misunderstand.

Yes I know there are many controversial issue about that, specially treating Math.log(0.0, 0.0), Math.log(1.0, 0.0) and Math.log(1.0, 1.0).

Even if there are some reason it had better return value,

I suppose Math.log(2.0,1.0) should not be Infinity and Math.log(1.0, 0.0) should not be -0.0.

In terms of raises Math::DomainError instead of returning NaN if the base is less than 0 at the (https://bugs.ruby-lang.org/issues/9797)

, this PATCH make sense.

But please feel free to point out my unsatisfactory points. (Actually this is first time to write c-lang thoroughly)

Thank you. gogo.

Before

# For all 0 <= n < 1
Math.log(n, 1.0)
=> -Infinity

Math.log(1.0, 1.0)
=> NaN

# For all n > 1
Math.log(n, 1.0)
=> Infinity


Math.log(0.0,0.0)
=> NaN

# For all 0 < n < 1
Math.log(n, 0.0)
=> 0.0

# For all n >= 1
Math.log(n, 0.0)
=> - 0.0

After

# For all n >= 0. Actually for all n <- R (a real number) because of checking domain of first argument

Math.log(n, 1.0)

Math::DomainError: Numerical argument is out of domain - “log”

Math.log(n, 0.0)

Math::DomainError: Numerical argument is out of domain - “log”

Files

test_math.rb_ Add tests for Math.log.PATCH (1.06 KB) test_math.rb_ Add tests for Math.log.PATCH gogotanaka (Kazuki Tanaka), 09/18/2014 05:50 AM
NEWS_ Update for Math.log.PATCH (564 Bytes) NEWS_ Update for Math.log.PATCH gogotanaka (Kazuki Tanaka), 09/18/2014 05:50 AM
math.c_ Math.log with base 0 or 1 should raise DomainError.PATCH (502 Bytes) math.c_ Math.log with base 0 or 1 should raise DomainError.PATCH gogotanaka (Kazuki Tanaka), 09/18/2014 05:51 AM
update_rdoc_for_Math.log.PATCH (721 Bytes) update_rdoc_for_Math.log.PATCH gogotanaka (Kazuki Tanaka), 09/23/2014 06:20 AM

Updated by gogotanaka (Kazuki Tanaka) about 10 years ago

I'd forgotten to update RDoc. So I add new patch for updating RDoc.

gogo.

Updated by gogotanaka (Kazuki Tanaka) about 10 years ago

After I thought twice about that,

I came to the conclusion that 1.0 should be considered as 1 + ε (infinitesimal)

In terms of ↓

1/0.0
=> Infinity

so below behave does make sense.↓

# For all 0 <= n < 1
Math.log(n, 1.0)
=> -Infinity

# For all n > 1
Math.log(n, 1.0)
=> Infinity

But when a base is exact 1, it doesn't make sense still.↓

# For all 0 <= n < 1
Math.log(n, 1)
=> -Infinity

# For all n > 1
Math.log(n, 1)
=> Infinity

We can say some for 0.0 or exact 0

So I wanna make changes in patchs, if anybody have free time, please remove these patchs.

thank you. gogo.

Updated by gogotanaka (Kazuki Tanaka) about 10 years ago

Associated revision 10474

Updated by gogotanaka (Kazuki Tanaka) almost 10 years ago

Hi there. I'm just gonna add a explain.

Math.log(1,-1)
#=> NaN

Math.log(0.0,-1)
#=> -Infinity

Math.log(0,-1)
#=> -Infinity

Math.log(-0.0,-1)
#=> -Infinity

Math.log(-1,-1)
#=> Math::DomainError: Numerical argument is out of domain - "log"

All these examples should raise Math::DomainError. right?

I wish this issue would be solved by 12/25(JST).

Anyway I can't wait for 2.2.0, thank you for your jobs always :)

P.S. I've just make sure Math::log with a negative base is fixed at #9797, thank you so much!!!

I'm really appreciate it! but, this issue about Math.log with base 0 or 1 still remain.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0