如何判断一个数的平方根是否为整数?

问题描述 投票:0回答:4
isinteger(sqrt(3))
0
isinteger(sqrt(4))
0

两个答案都为零。答案必须是:

isinteger(sqrt(3))
0
isinteger(sqrt(4))
1
octave
4个回答
5
投票

isinteger
检查类型。
integer
是一种变量类型,而不是数字的属性。例如
isinteger(2.0)
返回
0

尝试:

mod(sqrt(x),1) == 0

但是,由于数字精度,您可能仍然遇到问题。


3
投票

你也可以这样做

y = sqrt(4);
y==round(y)

或以 (2*eps) 相对容差考虑舍入误差

abs(y-round(y)) <= 2*eps*y

3
投票

其他人已经谈到了这一点,但您需要小心,您的应用程序要考虑浮点效应。有限的精度问题可能会带来意想不到的结果。例如,举这个例子:

这里从一个非常接近 4 (x) 的非整数值开始。该数字的双精度平方根恰好是 2 (y),但该数字的平方并不等于原始 x。因此计算出的平方根 y 确实是一个整数,但它实际上并不能说明情况,因为原始 x 不是整数。尽管 sqrt(x) 的浮点计算恰好是一个整数,但 x 的实际平方根不是整数。

如果我们还检查原始 x 是否是整数怎么办?好吧,举个例子:

这里原来的x太大了,x附近的每个浮点数都是整数,所以x+eps(x)是整数。计算出的双精度平方根也是整数 (y)。但即使两者都是整数,y*y 也不等于 x。同样,我们会遇到 x 的实际平方根不是整数,但 sqrt(x) 的浮点计算值恰好是整数的情况。

所以,最重要的是,这可能比您预期的要棘手一些。我们不知道您的应用程序,但您可能需要检查 x 和 y 都是整数,并且 y*y == x 为真,然后再说服自己 x 的平方根是整数。即使如此,也可能存在所有这些检查都通过但仍然存在浮点效应根本无法发现的差异的情况。


0
投票
fun isPerfectSquare(n: Int): Boolean {
    val sqrt = kotlin.math.sqrt(n.toDouble()).toInt()
    return sqrt * sqrt == n
}
© www.soinside.com 2019 - 2024. All rights reserved.