C 关于浮动和浮动的溢出问题×;整数

C 关于浮动和浮动的溢出问题×;整数,c,floating-point,floating-point-conversion,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) 浮点数是否会溢出,或者只是换行到“正

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) 浮点数是否会溢出,或者只是换行到“正常”值

首先


  • 如果进行整型或长型计算,则不涉及浮点运算。因为第一部分中的结果会有许多几乎相等的不同值 因为(浮动)v1/v2=ab.cdef.//其中cdef可以变化

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

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

    比如2^18/常数,在这种情况下是1000000

    所以

    这将是任何黑客的证据


    希望这有帮助

    是的,如果v1=10000000000000和v2=1,示例(1)中的结果很容易溢出。您不需要该常量上的LL,因为它足够小,可以放入
    int
    (在大多数实现中,无论如何)

    (2) 如果v1和v2与我给出的一样,那么它可能会溢出,就像示例1一样

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

    (3) 浮动肯定会溢出,其结果取决于实现

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

    if ((LONG_LONG_MAX / 1000000) > V1)
    {
    ...
    }
    
    如果您真的达到了限制,您可以通过将变量声明为
    无符号
    ,给自己多一点空间


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

    我认为如果((LONG_LONG_MAX/1000000)>V1){…}“如果进行INT或LONG计算,则不涉及浮点运算。因为第一部分中的结果将有许多几乎相等的不同值。因为(float)V1/v2=ab.cdef//其中cdef可以变化。”我一点也不明白。给定2个整数,浮点结果不是特定的吗?不,如果两个整数的值是10^9和10^4的顺序,则不会是特定的,并且当将任何一个整数键入浮点时,它将永远不会在小数点后给出相同的值。。。。
    if ((LONG_LONG_MAX / 1000000) > V1)
    {
    ...
    }