Project

General

Profile

Feature #10255

Math.log: check domain of base argument

Added by gogotanaka (Kazuki Tanaka) almost 5 years ago. Updated over 4 years ago.

Status:
Open
Priority:
Normal
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

History

Updated by gogotanaka (Kazuki Tanaka) almost 5 years ago

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

gogo.

Updated by gogotanaka (Kazuki Tanaka) almost 5 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) over 4 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.

Also available in: Atom PDF