将过于精确的分数舍入到人性化的精度

时间:2014-05-22 06:41:04

标签: math exif wic

如何将过分精确的分数舍入到更难以读取的精确格式?

我正在处理由MS'Windows Imaging Component提取的JPEG EXIF曝光时间数据。 WIC以分数形式返回曝光时间,分别为分子和分母的整数。

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

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

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

试试这个:

human_readable_denominator = int(0.5 + 1 / precise_exposure_time)

用你给出的例子:

human_readable_denominator = int(0.5 + 1 /(7391/1000000))                            = 135

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

  • 菲尔

答案 2 :(得分:0)

在Haskell Data.Ratio中查看approxRational。你给它一个数字和一个epsilon值,它给出了该数字的epsilon中最好的有理数。我想其他语言有类似的库函数,或者你可以翻译Haskell source for approxRational