将两个整数除以不转换为double

时间:2012-02-08 17:02:58

标签: c++

我有两个整数变量,partialtotal。这是一个进步,因此partial从零开始,一个接一个地上升到total的值。

如果我想获得一个表示进度的分数值(从0.0到1.0),我可以执行以下操作:

double fraction = double(partial)/double(total);

但如果总数太大,转换为双倍可能会丢失信息。

实际上,丢失的信息量是可以忍受的,但我想知道是否有算法或std函数来获取两个值之间的分数会丢失更少的信息。

3 个答案:

答案 0 :(得分:7)

显而易见的答案是将partial乘以一些比例因子; 100是一种常见的选择,因为除法则将百分比作为 一个整数值(向下舍入)。问题是,如果值是 如此之大,以至于无法在double中精确表示它们 也很有可能乘以比例因子 溢出。 (就此而言,如果他们那么大,那么初始值 将在大多数机器上溢出int。)

答案 1 :(得分:1)

是的,有一种算法会丢失更少的信息。假设您要查找最接近分数数学值的double值,则需要一个能够保持total << 53的整数类型。您可以创建自己的或使用像GMP这样的库。然后

  • 缩放partial以便(total << 52) <= numerator < (total << 53),其中numerator = (partial << m)
  • q为整数商numerator / totalr = numerator % total
  • 如果mantissa = q 2*r < total= q+1 2*r > total2*r == total mantissa = q+1= q,如果你想要向上一半,result = scalbn(mantissa, -m) (double)partial / (double)total {{1}} {{1}} 1}}如果你想要向下舍入一半,如果你想要半圆甚至
  • 那么两者中的偶数
  • {{1}}

大多数时候你获得与{{1}}相同的值,一个最低有效位的差异可能不是太罕见,两个或三个LSB差异也不会让我感到惊讶,但是很少见,更大差异是不太可能的(也就是说,有人可能会很快给出一个例子)。

现在,值得努力吗?通常不会。

答案 2 :(得分:0)

如果你想要一个精确的分数表示,你有某种结构,其中包含分子和分母作为整数,并且,对于唯一表示,你只需要考虑最大公约数(特殊情况为零)。如果你只是担心在重复操作后浮点表示可能不够准确,你需要找到一些关于数值分析的课程,这个问题并不严格是一个编程问题。有比其他方法更好的方法来计算某些结果,但我不能真正进入它们(我从未完成过课程,只是阅读了它。)