由于浮点舍入误差,非整数的平方根可以变成整数吗?

Vil*_*lx- 1 math floating-point square-root

在另一个不相关的互联网论坛上,有人询问如何检查给定数字的平方根是否为整数.现在本身就是一个微不足道的家庭作业问题,但我开始怀疑这种天真的方法在所有情况下是否都是正确的.也就是说,在伪代码中:

declare x, y as double
input x
y = sqrt(x)
if round(y) = y then
    output "Is integer"
else
    output "Isn't integer"
Run Code Online (Sandbox Code Playgroud)

是否有可能输入这样一个x,它x本身不是一个整数(或一个不是另一个整数的平方的整数),但由于浮点错误sqrt(x) 会是整数?

Lyt*_*yth 8

是的:当x位于Machine epsilon的边缘时.考虑x = 1.00 ... 0001,其中它仍以二进制形式表示,与1.0不同.这个数字的平方根将给出1.0,产生错误的意义.