浮点数和浮点数×整数的溢出问题

时间:2010-08-09 08:40:11

标签: c floating-point floating-point-conversion

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)浮动可以溢出,还是仅仅包含“理智”值?

2 个答案:

答案 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)

首先

  1. 如果执行INT或Long计算不涉及浮点数。因为你在First部分的结果会有许多不同的值,几乎相等。
  2. 因为(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);
    

    这将是任何黑客证据。

    希望这会有所帮助