IEEE754:除法结果保证

IEEE754: guarantees on division results

考虑:

x 是一个正整数,最大值不太可能超过 10,000,000。

y是一个>=0的小整数,最大值约为5;如有必要,我可以设置上限。

计算

z 然后四舍五入到最接近的整数,中间的情况向上四舍五入。我对数字正确答案向上舍入的情况感兴趣,但双精度 754 给出 'wrong' 答案,然后向下舍入。因此,换句话说,数值正确的结果有小数部分 >=0.5,但实际结果的小数部分 <0.5.

我使用的语言不允许我访问 FPU 设置,所以我只能使用默认设置(主要是 x86_64、Linux 和 Windows)。

我是否只需要接受某些答案将是 'wrong',或者我是否可以对 xy[=31 设置一些限制=] 哪些可以保证给出所需的答案?还是有一种替代计算方法可以在四舍五入后给出正确答案?如有必要,我还可以更改 z 舍入方式的定义,前提是我确实可以保证结果。

假设:

  • x ≤ 10,000,000.
  • 0 ≤ y ≤ 5.
  • 使用 IEEE-754 基本 64 位二进制浮点数,四舍五入到偶数。

那么除法的结果永远不是小数部分小于 ½ 而是四舍五入到 ½ 的数字。

x = 10,000,000 且 y = 0 时出现最大结果,在这种情况下 z = 10,000,000。那么 z 的整数部分有 24 位。浮点格式的有效位有 53 位,因此小数部分仍有 29 位可用。这意味着任何小于 ½ − 2−30 的小数部分都将四舍五入为 ½ − 2−29 或更少(因为可用于分数能够做出很好的区分——如果数学结果小于 ½ − 2−30,则有一个比 ½ 更接近它的可表示值,因此使用较低的值).

因此,只有分数在 [½ − 2−30, ½) 中的精确数学结果可能小于 ½,但四舍五入为 ½。令 z 是这样一个值,令 t 是它的小数部分。

从问题的陈述中,我们知道z • 10y是一个整数 (x)。因此 t • 10y 是一个整数,即使 y小于5,t • 105是一个整数。

因为 t 在 [½ − 2−30, ½), t • 105 在 [(½ − 2−30) • 105, ½ • 10 5) = [50,000 − 2−30 • 105, 50,000) = [50,000 - 0.0000931322574615478515625 , 50,000).

显然这个区间没有整数,所以不存在z