2

如何将过于精确的分数四舍五入为更易于阅读的不太精确的格式?

我正在使用 MS 的 Windows 成像组件提取的 JPEG EXIF 曝光时间数据。WIC 以分数形式返回曝光时间,分子和分母具有单独的整数。

WIC 通常按预期工作,但对于某些 JPEG,WIC 以百万分之一秒返回曝光时间,这意味着它报告的曝光时间为 7391/1000000 秒,而不是报告例如 1/135 秒的曝光时间。1/135 和 7391/1000000 之间的差异非常小,但后者对大多数用户来说并不直观。因此,我想将过于精确的曝光时间四舍五入到摄影中使用的最接近的标准曝光时间。

除了使用已知合理曝光时间的查找表并找到最接近的匹配之外,还有更好的方法吗?

4

3 回答 3

2

您可以计算大分数的连分数展开式。然后取一个第一个收敛作为你的近似分数。

在你的情况下,你得到

7391/1000000 = [ 0; 135, 3, 2, ...]

所以第一个收敛是 1/135=0.0074074...,下一个

1/(135+1/3) = 3/406 = 0.00738916256...

第三个

1/(135+1/(3+1/2)) = 1/(135+2/7) = 7/947 = 0.00739176346...

要计算连续分数展开的(第一个)系数,请从 xk=x0 开始。然后迭代地应用程序

  • 将 xk=n+r 分成整数 n 和小数部分 r。
  • 整数是下一个系数 ak,用小数部分的倒数重新开始这个过程,xk = 1/r

应用于给定的数字,这正好产生上述序列的开始然后重构有理表达式,继续直到分母的平方的倒数小于给定的容差。

于 2014-05-22T06:59:54.660 回答
1

看看approxRationalHaskell 的Data.Ratio. 您给它一个数字和一个 epsilon 值,它会给出该数字的 epsilon 内最好的有理数。我想其他语言也有类似的库函数,或者您可以将Haskell 源代码翻译为approxRational.

于 2014-06-13T12:50:59.937 回答
0

尝试这个:

human_readable_denominator = int(0.5 + 1 /precision_exposure_time)

用你给出的例子:

人类可读分母 = int(0.5 + 1 / (7391/1000000)) = 135

这适用于小于 1/2 秒的曝光时间。对于更长的曝光时间,转换为 1/X 格式没有意义。

  • 菲尔
于 2014-06-13T12:43:38.943 回答