Matlab中寻找满足指定精度π分数近似值的代码问题排查
问题排查与修正方案
你的代码存在以下核心问题:
- 找到满足条件的
p后直接跳出内层循环,但没有记录任何结果,循环结束后看不到找到的p、q值 - 逻辑错误:要找最小的正整数
p、q,应该优先找最小的q,再在对应q下找最小的p;但原代码遍历q时,找到某个q下的p就跳过该q后续的p,却不会停止外层循环,也没比较不同q的优劣 - 未处理**找不到符合条件的
p、q**的情况,比如输入的M、N太小的时候
修正后的代码
M = input('Give an upper bound for p:'); N = input('Give an upper bound for q:'); d = input('Give a positive integer between 1 and 15:'); % 初始化存储最小解的变量 min_q = Inf; min_p = Inf; target = 10^(-d); for q = 1:N % 对当前q,计算理论上最接近π*q的p值,缩小p的遍历范围 ideal_p = round(pi * q); % 只遍历ideal_p附近的数,避免无意义遍历,同时确保p在1到M之间 p_start = max(1, ideal_p - 2); p_end = min(M, ideal_p + 2); for p = p_start:p_end if abs(pi - p/q) <= target % 找到符合条件的p,检查是否是当前最小的q,或q相同但p更小 if q < min_q || (q == min_q && p < min_p) min_q = q; min_p = p; end % 找到当前q下最小的p就可以跳出内层循环 break; end end end % 输出结果 if isfinite(min_q) fprintf('找到最小的p=%d,q=%d,满足|p/q - π| ≤ 10^-%d\n', min_p, min_q, d); fprintf('验证:|%d/%d - π| = %.16f ≤ %.16f\n', min_p, min_q, abs(pi - min_p/min_q), target); else fprintf('在给定的上限M=%d、N=%d下,未找到符合条件的p、q\n', M, N); end
关键改进点
- 增加结果存储变量
min_p和min_q,专门记录当前找到的最小解 - 对每个
q,先计算最接近π*q的整数p,只遍历该值附近的数,大幅减少循环次数,避免无效遍历 - 每次找到符合条件的
(p,q)时,会和当前记录的最小解比较,确保最终得到的是q最小,q相同则p最小的解 - 增加无结果时的提示,避免程序运行后无输出
内容的提问来源于stack exchange,提问作者GaloisTH
相关产品推荐
相关产品推荐

