C++ 测试浮点数 double * double 是否会溢出 uint64_t

3
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的情况下,显然会有哪些问题?


@KillzoneKid 我已经在其他地方检查过了。 - gda2004
1
你列出的函数与你的问题之间的关系还不清楚。 - einpoklum
你的问题中并没有实际的问题。你展示的代码有什么问题? - Some programmer dude
2
什么问题?对上面所写的内容进行非常彻底的检查,没有提出任何具体的编程问题。 - Sam Varshavchik
1
@Someprogrammerdude 我想知道是否存在不明显的边缘情况。 - gda2004
如果 v 是负数...? - Eljay
1个回答

6
这对于IEEE754的 double 类型是有危险的,因为并非所有大于2的53次方的整数都可以被准确地表示,所以a * b可能会被截断为比实际乘积更小的值。因此,你的return可能会给出错误的负面结果。其他double方案也将受到类似的影响。
还要注意,std::numeric_limits<uint64_t>::max()也会被转换为double类型 - 对于IEEE754,你将得到18446744073709551616而不是18446744073709551615
传统的除法检查不会受到这些影响。

2
如果您在此处添加传统的校验代码并回复我,那么这将值得+1。 - Jonathan Mee
@JonathanMee:这比较繁琐,而且你不应该用浮点数来实现。这里有一个针对有符号类型的版本,但是很容易进行调整:https://wiki.sei.cmu.edu/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow - Bathsheba
1
今天的咖啡怎么样? - Hatted Rooster
1
@SombreroChicken:太棒了,虽然如果我试图写出除法检查,我可能需要另一个。 - Bathsheba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接