c++:static_cast<int> std::sqrt(x) 是否总是给出平方正整数的精确结果?

use*_*931 5 c++ sqrt

是否保证对于static_cast<int>(std::sqrt(x * x)) == x所有正 x 且 x*x 不会溢出?

如果不是,我将如何稳健地计算这些数字的平方根?

Ast*_*ngs 0

来自 cppreference:

std::sqrtIEEE 标准要求准确。唯一需要精确的其他操作是算术运算符和函数std::fma。舍入到返回类型后(使用默认舍入模式), 的结果std::sqrt与无限精确的结果没有区别。换句话说,误差小于0.5 ulp。其他功能,包括std::pow,则不受如此限制。(参考

因此,考虑到您的限制,我看不出有任何担心的理由。