#include <iostream>
using namespace std;
double n;
int main() {
cin >> n;
double l = -10000, r = 10000;
while (r - l >= 1e-8) {
double mid = (r + l) / 2;
if (mid * mid * mid >= n) r = mid;
else l = mid;
}
printf("%.6lf", l);
}
答案的初始化范围
求n的三次方根, n的范围是[-10000, 10000]
, 所以答案ans 的范围可以初始化为[-10000, 10000]
但是
求n的二次方根, n的范围是[0, 0.01]
,答案ans 的范围不能初始化为[0, 0.01]
应该初始化为[0, 0.1]
, 所以当右端点x<=1
, 答案ans 的范围应该初始化为max(1, x)
, 上述例子, 可以初始化为[0, 1]
浮点数比较问题
如果两个浮点数的差的绝对值小于一个很小的数。
比如此题中的1e-8
, 因为题目要求 小数点后保留6个以上数字。
如果是要求 小数点后保留6位有效数字 。
对于浮点数的比较,我们不能用等于号判定浮点数相等。