C 计算最近的浮点值

C 计算最近的浮点值,c,floating-point,C,Floating Point,可能重复: 我有一个浮点值,比如说0.595781,我想用一个只使用整数分子和分母值的商来尽可能接近它,这两个值的范围都是0到1023(10位) 这样做的直观方法(至少从一开始)是使用595/1000,它提供了一个非常接近的匹配(错误是0.040781) 但是有一个更好的匹配597/1002,它是0.595808(错误为0.0000273)。也许还有更好的比赛。第二个商是通过以一种不可比的方式处理接近其原始值的分子和分母值得出的 然后我想知道是否有一种方法可以给出所有的标准来直接得到分子和分母

可能重复:

我有一个浮点值,比如说
0.595781
,我想用一个只使用整数分子和分母值的商来尽可能接近它,这两个值的范围都是
0到1023(10位)

这样做的直观方法(至少从一开始)是使用
595/1000
,它提供了一个非常接近的匹配(错误是
0.040781

但是有一个更好的匹配
597/1002
,它是
0.595808
(错误为
0.0000273
)。也许还有更好的比赛。第二个商是通过以一种不可比的方式处理接近其原始值的分子和分母值得出的

然后我想知道是否有一种方法可以给出所有的标准来直接得到分子和分母的整数值

如果您想知道,为
Infineon XE167G设备设置波特率生成器时需要这两个整数值

任何想法都将不胜感激。
关于

如果您使用的是
16位
整数,您可以只使用
分子=59578
,分母只保留功率因数
10
,例如
5
。所以答案应该是
59578/(10^5)

使用这种方法,您至少可以保持
4
精度。
只是想一想……

当简单的四舍五入导致596/1000更接近时,为什么595/1000会更直观呢?你想要的是分母d=1024的值。这在Borgeader链接的副本中得到了回答。为了获得最佳精度,您使用了可用的最高拆卸器(对于0到1023的值,这是512),它是2的幂。那么第一个分子是圆的(512*值)。这保证了精度始终小于1/512,因为浮点值是二进制的。要更正分母以获得更好的精度,请计算一个更正项=(分子/值)-分母(添加到分母)。要更正分母以获得更好的精度,请计算更正项=(分子/值)-分母(添加到分母)。示例:0.595781*512=305。校正=(305/0.59..)-512=-0.06(无校正)。所以你得到了305/512,它是0.595703,只比0.595808305/512稍微差一点,给出了一个近似值,但339/569给出了一个更接近的值。我试图解决的问题是如何在分母和分子范围约束下获得最佳近似值。引用以前的帖子(关闭了这个线程)是不合适的,因为它没有限制分子范围。谢谢。问题是分子和分母的最大值都只能为1023(10位),这使得问题比看起来更难解决。这是一个寻找直接计算分子和分母的算法的例子,或者是一个可能会做一些尝试和错误的交互方法。当做