使用 '==' 比较双打



我写了下面的二进制搜索代码:

class Solution {
public:
bool check(vector<int>& dist, double hour, int mid) {
if(mid==0) return false;

double sum=0.0;
for(int i=0; i<dist.size()-1; i++)
sum+=ceil((double)dist[i]/mid);
sum+=(double)dist.back()/mid;

return sum<=hour ? true : false;
// sum+=0.001f;
// return sum<hour || std::fabs(hour-sum)<=0.001f ? true : false;
}

int minSpeedOnTime(vector<int>& dist, double hour) {
int l=0, r=10000001;

while(l<r) {
int mid=l+(r-l)/2;
if(check(dist, hour, mid)) {
r=mid;
} else l=mid+1;
}

return r==10000001 ? -1 : r;
}
};

它起作用;接受";,但我有几个问题:

a。语句return sum<=hour ? true : false;正确吗?我不确定,因为sumhour都是doubles。我们不应该像这里讨论的那样,使用一些"ε"进行"=="比较吗
b。如果未注释,则显示以下语句:

返回sum<hour||std::fabs(小时总和(<0.001f?真:假;

产生错误的答案。为什么?问题陈述说";小时在小数后最多有两位数字;。那么,为什么它给出了一个错误的答案呢
c。如果我添加0.001f:,它就会被接受

sum+=0.001f;
return sum<hour || std::fabs(hour-sum)<=0.001f ? true : false;

再说一遍,为什么
编辑:即使是上面的std::fabs(hour-sum)==0.001f也不会被接受。

第2版:问题说明在这里,但我没有询问解决方案等,所以我没有在问题中发布它。

使用'==='比较双打

在这种情况下,甚至不应该使用浮点,或者至少应该大大减少浮点。

没有舍入问题的示例。

bool check(vector<int>& dist, double hour, int mid) {
long long sum_times_mid = dist.back();
for(int i=0; i<dist.size()-1; i++) {
sum_times_mid += dist[i];
}
return sum_times_mid <= hour*mid;  // Only FP code here
}

相关内容

  • 没有找到相关文章

最新更新