(编辑:回应脾气暴躁的评论,不,它不是功课.我正在进行音调检测,获取一系列潜在的谐波峰值,并尝试构建基频的候选者.因此,它实际上是一个非常实际的问题. )
考虑(例如)pi的最佳分数近似,通过增加分母排序:3/1,22/7,355/113,......
挑战:创建一个整洁的 C算法,它将为给定的浮点数生成第n个商a/b,同时返回差异.
calcBestFrac(float frac,int n,int*a,int*b,float*err){...}
我认为最好的技术是持续分数
拿走pi的小部分,你得到3
现在,剩下的是0.14159 ... = 1/7.06251 ..
因此,下一个最佳理性是3 + 1/7 = 22/7
从7.06251拿走7,你得到0.06251 ..大约1/15.99659 ..
将其称为16,然后下一个最佳近似值为
3 + 1 /(7 + 1/16)= 355/113
但是,转换成干净的C代码远非微不足道.如果我得到一些整洁的话,我会发帖.同时,有人可能会喜欢它作为脑力激荡器.
我正在寻找一种将浮点数的精确值转换为两个整数的有理商的方法,即a / b
其中b
不大于指定的最大分母b_max
。如果b <= b_max
不可能满足条件,则结果回退到仍然满足条件的最佳近似值。
坚持,稍等。这里有很多关于截断实数的最佳有理近似的问题/答案,该数表示为浮点数。但是,我对浮点数的确切值感兴趣,它本身就是一个具有不同表示形式的有理数。更具体地说,浮点数的数学集合是有理数的子集。在 IEEE 754 二进制浮点标准的情况下,它是二元有理数的子集。无论如何,任何浮点数都可以转换为两个有限精度整数的有理商,如。a / b
因此,例如假设 IEEE 754 单精度二进制浮点格式,有理等价的float f = 1.0f / 3.0f
不是1 / 3
,而是11184811 / 33554432
。这是 的精确值f
,它是来自 IEEE 754 单精度二进制浮点数数学集合的一个数字。
根据我的经验,遍历(通过二分搜索)Stern-Brocot 树在这里没有用,因为当它被解释为截断的实数而不是精确的浮点数时,这更适合于逼近浮点数的值理性的。
可能,连分数是要走的路。
这里的另一个问题是整数溢出。想想我们要把有理数表示为二的商int32_t
,其中最大的分母b_max = …
c++ floating-point rational-number numerical-methods continued-fractions
我编写了这段代码来计算使用欧几里德算法的有理数N的连续分数展开:
from __future__ import division
def contFract(N):
while True:
yield N//1
f = N - (N//1)
if f == 0:
break
N = 1/f
Run Code Online (Sandbox Code Playgroud)
如果说N是3.245,则函数永远不会结束,因为显然f永远不等于0.扩展的前10个术语是:
[3.0,4.0,12.0,3.0,1.0,247777268231.0,4.0,1.0,2.0,1.0]
这显然是一个错误,因为实际扩展只是:
[3; 4,12,3,1]或[3; 4,12,4]
是什么原因引起了这个问题?这是某种舍入错误吗?
python division integer-division fractions continued-fractions
我是Python的新手,被要求创建一个程序,该程序将输入作为非负整数n,然后使用连续分数的前n + 1个项来计算e的近似值:
我试图破译这个问题,但无法完全理解它所问的一切。我不是在寻找确切的答案,而是希望有一个例子可以对我有所帮助。
这是确切的问题,
下面是我之前对连续分数所做的代码。
import math
# Get x from user
x = float(input("Enter x = "))
# Calculate initial variables and print
a0 = x//1
r0 = x-a0
print("a0 =", a0, "\tr0 =", r0)
# Calculate ai and ri for i = 1,2,3 and print results
a1 = 1/r0//1
r1 = 1/r0 - a1
print("a1 =", a1, "\tr1 =", r1)
a2 = 1/r1//1
r2 = 1/r1 - a2
print("a2 =", a2, "\tr2 =", r2)
a3 = 1/r2//1 …
Run Code Online (Sandbox Code Playgroud)