在C / C ++中:
我需要查找一些大数字是否是完美的正方形,但我的代码发现数字如851659987045856130有效,当922854261.00000000487617621781778是实际的平方根(精度更高)且不是整数。有没有办法延迟舍入以获得更好的精度? 我知道上面的数字甚至没有"完美的方形最后数字"但我想知道一般是否可以检查这么大的数字是否实际上是一个完美的正方形,合理但精度高于标准。
答案 0 :(得分:1)
这里最好的办法是使用精确的平方根算法。如果该数字代表您正在测试的大小,您甚至不需要多精度算术包 - 但是,这样的包将是获得这种算法的实现的最简单的地方。实际上,它可能直接实现is_square
(并且可能比计算平方根更快)。
如果您对滚动自己的实现感到好奇,通常的方法是Newton的方法;例如正如https://en.wikipedia.org/wiki/Integer_square_root所见。
答案 1 :(得分:1)
不仅std::sqrt
不够精确,double
甚至不够精确,无法正确表示您的输入。要获得有效的结果,您必须执行真实的"检入整数运算。
整数平方根方法的简单替代方法可以是使用std::sqrt
的结果作为精确搜索正方形的提示:
bool is_square(int64_t val) {
int64_t guess = std::sqrt(val);
for(int64_t g=guess;;++g) {
if(g*g==val) return true;
if(g*g>val) break;
}
for(int64_t g=guess-1;;--g) {
if(g*g==val) return true;
if(g*g<val) break;
}
return false;
}
我怀疑这可能比真实的东西快#34;在大多数情况下,假设浮点平方根算法甚至可以在硬件中实现,因此应该非常快速地给出起点(算法的其余部分应该非常快,两个循环应该在少量迭代后退出)。 / p>
答案 2 :(得分:-2)
将结果截断为int,然后将其自身相乘以查看您是否以原始数字结束。