我怎样才能把一个过于精确的分数圈成一种不那么精确的格式,使之更具人情味呢?
我正在处理由MS的Windows成像组件提取的JPEG EXIF曝光时间数据。WIC以分数形式返回曝光时间,分子和分母的独立in。
WIC通常按预期工作,但对于某些JPEG,WIC以百万分之一秒为单位返回曝光时间,这意味着它报告的曝光时间为7391/1000000秒,而不是报告1/135秒的曝光时间。1/135和7391/1000000之间的差别很小,但对于大多数用户来说后者并不直观。因此,我想把过度精确的曝光时间调整到最近的标准曝光时间。
除了使用已知的合理曝光时间的查找表和找到最近的匹配之外,还有更好的方法来做到这一点吗?
发布于 2014-05-22 06:59:54
你可以计算大分数的连续分数展开。然后把第一批浓缩剂中的一种作为你的近似分数。
在你的情况下,你得到
1000000/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开始。然后迭代地应用该过程
应用于给定的数字,这正好产生上述序列的开始,然后重建有理表达式,继续,直到分母的平方的反比小于给定的公差。
发布于 2014-06-13 12:43:38
试试这个:
human_readable_denominator = int(0.5 +1/ precise_exposure_time)
你举的例子是:
human_readable_denominator = int(0.5 +1/ (7391/1000000)) = 135
对于小于1/2秒的曝光时间,这是很好的。对于较长的曝光时间,转换为1/X格式是没有意义的。
发布于 2014-06-13 12:50:59
看看Haskell's Data.Ratio
中的Data.Ratio
。你给它一个数字和一个epsilon值,它给出这个数的epsilon中最好的有理数。我猜想其他语言有类似的库函数,或者您可以翻译approxRational
。
https://stackoverflow.com/questions/23799534
复制相似问题