开放问题 >>

简化分数


作者: chaoyan
类型: EDA

在STA中,如果两个同步clock的周期不同,我们需要计算最小的共同周期,以寻找最差的lauch/capture边沿。例如,lauch clock的周期是4,capture clock的clock是6,两者的最小公倍数是12,我们需要将launch clock扩展三次,capture clock扩展两次,并在期间寻找最差的launch-capture edge。

但实际中,clock的周期表示为浮点数,例如2.3ns,4.2ns等,而浮点数是有表示和计算误差的,使得计算两个浮点数的“最小公倍数”不可行。那给定两个周期为浮点数的clock,如何扩展并找到最差的launch-capture edge呢?因为浮点数的特性,我们允许一定的误差:eps。例如,两个clock的周期分别为 1.33, 1.0,那应该将第一个clock扩展3倍,第二个clock扩展4倍,他们的误差是 |1.33*3-4| < 0.001.

规范的描述问题为: 给定两个浮点数f1, f2,和eps(e.g. 1e-9),和正整数K(e.g. 1000),求最小的正整数n1, n2,使得 n1,n2<K,且 |n1*f1 - n2*f2| < eps。最快的算法是什么?

方案1: O(logK)算法。基于糖水不等式,采用Stern-Brocot树,二分查找。