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)浮动可以溢出,还是仅仅包含“理智”值?
答案 0 :(得分:2)
是的,例如,如果v1 = 1000000000000000且v2 = 1,示例(1)中的结果很容易溢出。您不需要该常量上的LL,因为它足够小以适合{{1} (在大多数实现中,无论如何)。
(2)如果v1和v2与我给出的那样,那就可以像示例1一样溢出。
第一个例子更昂贵,因为浮点运算比整数运算更昂贵。
(3)Floats肯定会溢出,后果依赖于实现。
正如Arjit指出的那样,在执行计算之前,可以通过检查v1的值来防止溢出。如果v1可能是否定的,你还需要检查负面版本,也许以下可能更好......
int
如果你真的不受限制,你可以通过将变量声明为if ((LONG_LONG_MAX / 1000000) > V1)
{
...
}
来为自己增加一点空间。
稍后 - 编辑以纠正Arjit指出的错误。
答案 1 :(得分:1)
首先
因为(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);
这将是任何黑客证据。
希望这会有所帮助