floating-point - IEEE754 : guarantees on division results

标签 floating-point ieee-754

考虑:

\x/10^y = z.5

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

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

z 被计算出来,然后四舍五入到最接近的整数,中间的情况向上四舍五入。我对数字正确答案向上舍入的情况感兴趣,但 double 754 给出“错误”答案,然后向下舍入。因此,换句话说,数值正确的结果有一个 >=0.5 的小数部分,但实际结果的小数部分是 <0.5。

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

我是否只需要接受某些答案是“错误”的,或者我是否可以对 xy 施加一些限制以保证给出所需的答案?还是有一种替代计算方法可以在四舍五入后给出正确答案?如有必要,如果我确实可以保证结果,我还可以更改 z 的舍入方式的定义。

最佳答案

假设:

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

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

最大的结果出现在 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, ½ • 105) = [50,000 − 2−30 • 105, 50,000) = [50,000 - 0.0000931322574615478515625, 50,000).

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

关于floating-point - IEEE754 : guarantees on division results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50318806/

相关文章:

c - 基本字符串到 float 转换

javascript - `always returns unordered result` 意味着 `returns false` 吗

javascript - 浮点尾数是否从右到左存储位

c - IEEE 754 位操作舍入误差

python - 为什么 4*0.1 的浮点值在 Python 3 中看起来不错,但 3*0.1 不好看?

python - 为什么在使用 Python 的 "float"函数时这些结果如此不同?

python - Python 2.7 中的几何级数

c - 特殊情况下浮点乘法的结合性

ruby - 导轨 : Time#to_f precision in JSON?

c - 为什么用 float 除以 10 的幂不如直接输入数字准确?