Feature #10255
Math.log: check domain of base argument
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
History
Updated by gogotanaka (Kazuki Tanaka) about 5 years ago
I'd forgotten to update RDoc. So I add new patch for updating RDoc.
gogo.
Updated by gogotanaka (Kazuki Tanaka) about 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) about 5 years ago
Associated revision 10474
Updated by gogotanaka (Kazuki Tanaka) about 5 years ago
Associated revision 10487
Updated by gogotanaka (Kazuki Tanaka) about 5 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.
Updated by gogotanaka (Kazuki Tanaka) almost 5 years ago
Related to https://bugs.ruby-lang.org/issues/10785