如何将过分精确的分数舍入到更难以读取的精确格式?
我正在处理由MS'Windows Imaging Component提取的JPEG EXIF曝光时间数据。 WIC以分数形式返回曝光时间,分别为分子和分母的整数。
WIC通常按预期工作,但对于某些JPEG,WIC以百万分之一秒为单位返回曝光时间,这意味着不会报告,例如曝光时间为1/135秒,曝光时间为7391/1000000秒。 1/135和7391/1000000之间的差异非常小,但后者对大多数用户来说并不直观。因此,我想将精确的曝光时间精确到最接近的摄影标准曝光时间。
除了使用已知合理曝光时间的查找表并找到最接近的匹配外,还有更好的方法吗?
答案 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开始。然后迭代地应用程序
应用于给定的数字,这恰好产生如上所述的序列的开始然后重建有理表达式,继续直到分母的平方的倒数小于给定的容差。
答案 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
。