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

Math 将过于精确的分数舍入到人性化的精度,math,exif,wic,Math,Exif,Wic,我怎样才能将一个过于精确的分数舍入到一个不太精确的格式,使其更易于人类阅读 我正在使用MS的Windows图像组件提取的JPEG EXIF曝光时间数据。WIC以分数形式返回曝光时间,分子和分母使用单独的整数 WIC通常按预期工作,但对于某些JPEG,WIC以百万分之一秒为单位返回曝光时间,这意味着与其报告例如1/135秒的曝光时间,不如报告7391/1000000秒的曝光时间。1/135和7391/1000000之间的差异非常小,但大多数用户对后者并不直观。因此,我想将过于精确的曝光时间四舍五入

我怎样才能将一个过于精确的分数舍入到一个不太精确的格式,使其更易于人类阅读

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

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


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

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

在你的情况下,你得到

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
应用于给定的数字,这将产生如上所述的序列的精确起点,然后重建有理表达式,继续,直到分母平方的倒数小于给定的公差。

尝试以下操作:

人类可读分母=int(0.5+1/精确曝光时间)

以您给出的示例为例:

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

这在曝光时间小于1/2秒时效果良好。对于较长的曝光时间,转换为1/X格式没有意义

  • 菲尔

看看Haskell's中的
approxRational
。你给它一个数字和一个ε值,它给出了这个数字ε内最好的有理数。我想其他语言也有类似的库函数,或者你可以翻译。

我没有数学背景来理解你的答案,但我接受了它,因为它可能对其他语言有用。分母的平方反比似乎不太相关。它是对部分连分数精度的估计。查看连续收敛所跨越的间隔长度。如果你想要1/X,这很有效。如果你有2001/5000,这将得到1/2,这可能不是你想要的。我不知道有任何相机的快门速度设置为2001/5000。最初的问题是找到最接近的标准快门速度,我的技术就是一个简单的近似方法。