Feature #10255
openMath.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
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
ping
Updated by gogotanaka (Kazuki Tanaka) almost 10 years ago
Associated revision 10487
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.
Updated by gogotanaka (Kazuki Tanaka) almost 10 years ago
Related to https://bugs.ruby-lang.org/issues/10785