bool multiply_overflow_double(double a,double b)
{
double v = a * b;
if (std::isfinite(v))
return (v > std::numeric_limits<uint64_t>::max());
return true;
}
我得到了两个双打,我需要检查它是否会溢出uint64_t。我确实考虑过用传统的除法方式做,但这似乎更简单。
与传统方式相比,a 和 b 将大于 0 的明显问题是什么?
IEEE754 double
是危险的,因为并非所有大于 2 的 53 次方的整数都可以准确表示,因此a * b
可能会被截断为比实际乘积更小的值。因此,您的return
可能会给您带来假阴性。其他double
计划也将受到类似的影响。
另请注意,std::numeric_limits<uint64_t>::max()
也将转换为double
- 对于IEEE754,您将获得18446744073709551616
而不是18446744073709551615
。
传统的除法检查不会受到这些影响。