ruby 检查给定数字中的一个是否是另一个数字的整数次幂的函数

ruby function that checks if one of given number is integer power of another one

受到post的启发,我想概括一下这个问题。 检查给定的数字 m 是否是数字 n 的整数次方。

Here is 我的第一次尝试和测试,一切正常。

然后我尝试写一些不同的东西,灵感来自 link 上对 post 的回复。 主要思想是检查一个数基于另一个数的对数是否为整数。出于这个原因,我使用自然对数知道,
logab/logac =logcb

(我的ruby版本是1.8.7)

def m_is_power_of_n(m,n)

    #false by definiton

    f1  = (n==0 and m!=0)
    f2 = (n==1 and m!=1)

    #true by definition

    t1 = m==n
    t2 = m==1

    if f1 or f2
        return false
    elsif t1 or t2
        return true
    else
        a = Math.log(m)/Math.log(n) 
        return a.to_i == a #updated after steenslag's comment
        #if a.to_i == a
        #    return true
        #else 
        #    return false
        #end
    end
end

我不知道我做错了什么,因为当我传递参数 (36,6)、(125,5) 时,它 returns true 正如我预期的那样。但是对于 (216,6) 或 (25,5) 它 returns false.

P.S。顺便说一句,我是一个ruby新手,欢迎所有关于编码风格的批评:)

你有一个精度问题,如果你使用 irb

就可以看到
irb(main):001:0> Math.log(216)
=> 5.375278407684165
irb(main):002:0> Math.log(6)
=> 1.791759469228055
irb(main):003:0> Math.log(216)/Math.log(6)
=> 3.0000000000000004

不幸的是 3.0000000000000004 不等于 3。

您可以四舍五入结果...

a = (Math.log(m)/Math.log(n)).round(14)