1

1)这是无法溢出的吗?

long long v1, v2, result;
[..]
result = ((long double) v1 / v2) * 1000000LL;

1.a) 我可以省略常数上的 LL 吗?以及为什么。

2)或者,这种没有浮动的变化可以吗?

long long l1, l2, result;
[..]
result = (1000000 * (v1 / v2) + v1 % v2);

2.a)哪个有更多的开销?第一个还是这个例子?

3) 浮点数是否会溢出,或者只是包装成“正常”的值?

4

2 回答 2

2

是的,如果 v1 = 1000000000000000 和 v2 = 1,示例 (1) 中的结果很容易溢出。您不需要该常数上的 LL,因为它足够小以适合int(在大多数实现中,在任何案子)。

(2) 如果 v1 和 v2 与我给出的一样,这可能与示例 1 一样溢出。

第一个示例更昂贵,因为浮点运算比整数运算更昂贵。

(3) 浮点数肯定会溢出,其后果取决于实现。

正如 Arjit 指出的那样,您可以通过在执行计算之前检查 v1 的值来防止溢出。如果 v1 可能是负数,您还需要检查负数版本,也许以下可能会更好......

if ((LONG_LONG_MAX / 1000000) > V1)
{
...
}

如果您真的遇到了限制,您可以通过将变量声明为 来给自己更多的空间unsigned

稍后 - 编辑以纠正 Arjit 指出的错误。

于 2010-08-09T09:06:29.107 回答
1

首先

  1. 如果进行 INT 或 Long 计算不涉及浮点数。因为您在第一部分的结果将具有许多几乎相等的不同值。

因为 (float)v1/v2 = ab.cdef。// 其中 cdef 可以变化。

如果 v1 = 2^15 和 v2 = 1,您的第二个实现也可能导致溢出

因此,如果您正在寻找溢出和安全性,则应始终检查

像 2^18/Constant 在这种情况下是 1000000

所以

if(2^18/Constant > v1)

    result = (1000000 * (v1 / v2) + v1 % v2);

这将是任何黑客证明。

希望这可以帮助

于 2010-08-09T08:55:27.827 回答