math - 将过于精确的分数舍入到人类友好的精度

标签 math exif wic

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

我正在处理由 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

应用于给定的数字,这将准确地产生上述序列的开头然后重建有理表达式,继续直到分母的平方的倒数小于给定的容差。

关于math - 将过于精确的分数舍入到人类友好的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799534/

相关文章:

math - 基于两个向量创建旋转矩阵

math - ℝ³ -> ℕ 有限数量值的映射

c++ - 如何在我的项目中同时包含wincodec.h和d3dx10.h(或d3dx11)文件

c++ - 如何从 WIC 解码器确定自上而下/自下而上?

java - 切割前 9 位数字

linux - 使用管道划分 bash 的最佳方法?

java - 在android中使用 picasso 从图像中读取EXIF数据

Android将经度转换为ExifInterface的GPS标签

ios - 保存期间会清除iOS 13照片内容

c# - 如何向图像添加 JPEG 注释 (COM)?