【发布时间】:2019-07-29 14:21:26
【问题描述】:
假设我们有三个整数(int、long、long long、unsigned int 等)变量a, b, c。通常,执行
c = a / b;
会导致分数被截断。但是,c 是否可能以错误的值结束?
我不是在说 a / b 可能超出c's type. 的范围,而是我说的是在 C 中如何实现整数除法。执行a / b 是否首先生成一个浮点类型的中间结果,然后中间值被截断?
如果是这样,我想知道中间值的精度损失是否会导致 c 的值不正确。例如,假设 a / b 的精确值是 2,但不知何故中间结果是 1.9999...,因此 c 最终会得到不正确的值 1。这种情况会发生吗,还是整数除法总是导致正确的如果期望值在 c 的类型范围内,则取值?
【问题讨论】:
-
这不是 Commodore 基本的,整数运算是作为整数完成的。整数运算通常比浮点数更有效。
-
整数数学是严格使用整数完成的。事实上,一些处理器只能进行浮点数学运算,而附加的浮点数学协处理器确实可以处理浮点数。
-
@NathanOliver 那么我可以安全地假设整数除法总是会导致正确的结果吗?
-
你必须担心上溢和下溢,但除此之外,整数数学是精确的。