所有浮点数都可以以形式表示,其中和是整数。根据定义,所有这些数字都是合理的。这就是为什么这个问题只有一个近似的解决方案。x = significand × 2exponentsignificandexponent
一种可能的方法是将数字扩展为连续的分数。如果遇到非常小的分母或零分母,则输入数字近似为有理数。或者,更好的是,如果所有分母都不大,则该数字近似无理。
粗略的想法:
bool is_rational(double x) {
x = std::abs(x);
for (int i = 0; i < 20; ++i) {
const auto a = std::floor(x);
if (x - a < 1e-8)
return true;
x = 1 / (x - a);
}
return false;
}
int main() {
std::cout << std::boolalpha;
std::cout << is_rational(2019. / 9102.) << std::endl; // Output: true
std::cout << is_rational(std::sqrt(2)) << std::endl; // Output: false
}
Run Code Online (Sandbox Code Playgroud)
人们应该考虑内部魔术数字的最佳选择is_rational()。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |