C 关于浮动和浮动的溢出问题×;整数
1) 这是不能流通的吗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) 浮点数是否会溢出,或者只是换行到“正
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=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)
{
...
}