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会有什么明显的问题?
答案 0 :(得分:6)
这对于IEEE754 double
是危险的,因为并非所有大于2的53次方的整数都可以准确表示,因此a * b
可能被截断为比实际产品更小的值。因此,return
可能会给你假阴性。其他double
计划也会受到类似的影响。
另请注意,std::numeric_limits<uint64_t>::max()
也会转换为double
- 对于IEEE754,您将获得18446744073709551616
而不是18446744073709551615
。
传统的分裂检查并没有受到这些影响。