如何将浮点数转换为人类可读的分数?

2024-01-19

假设我们有0.33,我们需要输出1/3.
如果我们有0.4,我们需要输出2/5.

我们的想法是使其具有可读性,让用户能够理解”y 中的 x 部分“作为理解数据的更好方式。

我知道百分比是一个很好的替代品,但我想知道是否有一种简单的方法可以做到这一点?


我找到了大卫·爱普斯坦的找到给定实数的有理近似值 http://www.ics.uci.edu/%7Eeppstein/numth/frap.cC 代码正是您所要求的。它基于连分数理论,速度非常快且相当紧凑。

我已经使用了针对特定分子和分母限制定制的版本。

/*
** find rational approximation to given real number
** David Eppstein / UC Irvine / 8 Aug 1993
**
** With corrections from Arno Formella, May 2008
**
** usage: a.out r d
**   r is real number to approx
**   d is the maximum denominator allowed
**
** based on the theory of continued fractions
** if x = a1 + 1/(a2 + 1/(a3 + 1/(a4 + ...)))
** then best approximation is found by truncating this series
** (with some adjustments in the last term).
**
** Note the fraction can be recovered as the first column of the matrix
**  ( a1 1 ) ( a2 1 ) ( a3 1 ) ...
**  ( 1  0 ) ( 1  0 ) ( 1  0 )
** Instead of keeping the sequence of continued fraction terms,
** we just keep the last partial product of these matrices.
*/

#include <stdio.h>

main(ac, av)
int ac;
char ** av;
{
    double atof();
    int atoi();
    void exit();

    long m[2][2];
    double x, startx;
    long maxden;
    long ai;

    /* read command line arguments */
    if (ac != 3) {
        fprintf(stderr, "usage: %s r d\n",av[0]);  // AF: argument missing
        exit(1);
    }
    startx = x = atof(av[1]);
    maxden = atoi(av[2]);

    /* initialize matrix */
    m[0][0] = m[1][1] = 1;
    m[0][1] = m[1][0] = 0;

    /* loop finding terms until denom gets too big */
    while (m[1][0] *  ( ai = (long)x ) + m[1][1] <= maxden) {
        long t;
        t = m[0][0] * ai + m[0][1];
        m[0][1] = m[0][0];
        m[0][0] = t;
        t = m[1][0] * ai + m[1][1];
        m[1][1] = m[1][0];
        m[1][0] = t;
        if(x==(double)ai) break;     // AF: division by zero
        x = 1/(x - (double) ai);
        if(x>(double)0x7FFFFFFF) break;  // AF: representation failure
    } 

    /* now remaining x is between 0 and 1/ai */
    /* approx as either 0 or 1/m where m is max that will fit in maxden */
    /* first try zero */
    printf("%ld/%ld, error = %e\n", m[0][0], m[1][0],
           startx - ((double) m[0][0] / (double) m[1][0]));

    /* now try other possibility */
    ai = (maxden - m[1][1]) / m[1][0];
    m[0][0] = m[0][0] * ai + m[0][1];
    m[1][0] = m[1][0] * ai + m[1][1];
    printf("%ld/%ld, error = %e\n", m[0][0], m[1][0],
           startx - ((double) m[0][0] / (double) m[1][0]));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将浮点数转换为人类可读的分数? 的相关文章

  • Google 文件系统中的块大小问题

    谷歌文件系统论文 http labs google com papers gfs html 块大小是关键设计之一 参数 我们选择了64MB 这比典型文件大得多 系统块大小 每个块 副本存储为普通 Linux 文件放在 chunkserver
  • 分割如何提高埃拉托斯特尼筛法的运行时间?

    我遇到了埃拉托色尼筛的分段实现 它的运行速度比传统版本快很多倍 有人可以解释一下分段如何提高运行时间吗 请注意 我想在其中找到素数 1 b 它适用于这个想法 用于查找 10 9 之前的质数 我们首先生成 sqrt 10 9 以下的筛选素数
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 天气预报算法多样

    目前 英国气象局的预测引发了一场巨大的 风暴 他们预测冬季将是温和 潮湿的冬季 而北爱尔兰的气温却是有记录以来最冷的 地面上有厚厚的积雪 这在 12 月通常很少见 这是我很想尝试的东西 并不是我声称我可以击败他们 而是想知道人们目前正在使用
  • 如何将多个矩形打包为 2d 盒子俄罗斯方块样式

    我有许多不同宽度和高度的矩形 我有一个更大的矩形平台来放置它们 我想将它们包装在平台的一侧 以便它们在纵向 X 尺寸上展开 但将横向 Y 尺寸保持在最小限度 就是把它们像俄罗斯方块游戏一样放置 不能有重叠 但可以有间隙 有没有算法可以做到这
  • 创建横幅交换算法来轮播广告

    我正在构建广告横幅轮播脚本基于印象整个月均匀地显示广告 每次请求显示广告时都会进行计算 所以这将是即时完成的 广告应显示为一个接一个轮流播放 而不是仅显示一个广告 1000 次展示 然后显示另一个广告 1000 次展示 大多数情况下 它应该
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • 如何在从左到右、从上到下排序的二维数组中搜索数字?

    我最近收到了这个面试问题 我很好奇有什么好的解决方案 假设我有一个二维数组 其中所有 数组中的数字在增加 从左到右 从上到下的顺序 底部 搜索和搜索的最佳方式是什么 判断目标号码是否在 大批 现在 我的第一个倾向是使用二分搜索 因为我的数据
  • 计算标签云中标签字体大小的公式是什么?

    我有一个标签云 我需要知道如何更改最常用标签的字体大小 我需要设置最小字体大小和最大字体大小 您可以使用线性或对数评估与某个标签相对于最大标签关联的项目数量 将其乘以最小和最大字体大小之间的差值 然后将其添加到最小字体大小 例如 伪代码中的
  • 以与版本页面上相同的方式区分两个字符串的算法是什么?

    我正在尝试按短语区分两个字符串 类似于 StackOverflow 在版本编辑页面上区分两个字符串的方式 执行此操作的算法是什么 是否有 gems 或其他标准库可以实现此目的 编辑 我见过其他比较算法 Differ http github
  • 生成非连续组合

    我正在尝试创建一个生成器 支持执行 next 的迭代器 可能在 python 中使用yield 它给出来自 1 2 n n 和 r 是参数 的 r 元素的所有组合 这样在选出的r个元素 没有两个是连续的 例如 对于 r 2 且 n 4 生成
  • 无痛“算法分析”培训? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学时曾有过一次关于 算法分析 课程的痛苦经历 但最近发现在大学中需要它真实世界 无论如何 我正在
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • 用于插入/删除/排名/选择查询的最佳数据结构/算法

    到目前为止 我知道像AVL树和红黑树这样的自平衡BST可以在O log n 次内完成这些操作 然而 要使用这些结构 我们必须自己实现AVL树或RB树 我听说有一个算法 实现这四个操作而不使用自平衡 BST 有了我们自己定义的结构 我们就需要

随机推荐

  • 用颜色绘制 SKPhysicsBody 的形状

    使用 SpriteKit 创建游戏 效果非常好 我正在使用物理学并且能够看到我的身体实际上在哪里 因为我的精灵里面可能有一些阿尔法 这真的会很有帮助 这也将有助于创建更精确的身体 在 SpriteKit 的文档中 他们讨论了 debugOv
  • 如何将 .Net 日期时间转换为 T-SQL 日期时间

    MyDataSource SelectParameters startDate DefaultValue fromDate SelectedDate Date ToString 如您所见 我正在 Net SqlDataSource 中设置参
  • 从自定义中间件(外部身份提供商)重定向期间未传递登录 ID

    我们希望在身份服务器中有一个外部身份提供商 用户被重定向到登录到此外部身份提供商 Idp 并在那里完成身份验证 外部 Idp 将响应重定向回我们的身份服务器 我们希望在其中根据响应形成用户声明并重定向回调用客户端 我们遵循了答案这个计算器问
  • Oracle 多次更新查询

    我的数据库中有两张如下表所示的表 在每个 DEPARTMENT CODE 的第一个表 ITEM 中 将有多个 ITEM CODE ITEM STORE CODE ITEM CODE DEPARTMENT CODE 011 912003 14
  • 如何在 IntelliJ 中执行外部工具

    我在哪里可以实际启动 IntelliJ 中的外部工具 我知道在哪里设置外部工具 并且我已经完成了 但我看不到在哪里启动它 我没有从 运行 菜单中看到它 也没有从任何右键单击菜单中看到它 您可以使用 JetBrains 的命令行工具支持插件从
  • select/poll 与异步 I/O 的性能

    从性能角度来看 哪一个更好 选择 轮询还是异步 I O 我之前的印象是 select poll 反复向内核请求数据 而异步 I O 则依赖于内核通知数据可用性 但是 我注意到 select poll 也依赖于内核通知 因此 我相信从性能的角
  • 如何在Python中转义撇号等?

    我有一个带有这样的符号的字符串 39 这显然是一个撇号 我尝试了 saxutils unescape 但没有任何运气 并尝试了 urllib unquote 我怎样才能解码这个 谢谢 查看这个问题 https stackoverflow c
  • C#、XML、添加新节点

    我正在尝试向现有 XML 文件添加新节点 我有这个文件 其中包含第一个测试元素
  • 无法访问 Azure Functions 的管理 URL

    我正在使用 powershell 并尝试访问 Azure 函数行政使用 API 我正在尝试获取在 appName 下创建的所有函数的列表 当然 我在调用之前将 appName 更改为实际的 Azure 函数名称 在这次通话之前我也得到了有效
  • Office Dialog API 向子对话框发送消息

    我们希望使用 Dialog API 进行一些更适合更大工作区域的额外操作 我们已经能够通过 API 从对话框中向家长发送消息 Office context ui messageParent 但是我们还希望能够直接向对话框发送消息 例如sen
  • 切换主题后如何保留我的(自定义)IDE 配色方案?

    Delphi Rio comes with two color schemes dark and light I open Tools gt Options gt Editor gt Color and changed the dark c
  • 弹跳球。使其在高峰时减速

    我在 x3d 中创建了一个弹跳球动画 我只是好奇如何让球在其高度的峰值处减速 使其看起来更真实 先感谢您
  • Nodejs 中工作线程如何工作?

    Nodejs 不能像 java 和 net 那样有内置的线程 API 做 如果添加线程 语言本身的性质就会 改变 无法将线程添加为一组新的可用线程 类或函数 Nodejs 10 x 添加了工作线程作为实验 现在从 12 x 开始稳定 我浏览
  • CSS 编辑器,可扩展编辑时的单行声明

    是否有一个 CSS 编辑器可以自动将单行声明扩展为焦点上的多行声明 为了澄清我的想法 请参阅下面的示例 原始CSS div main color orange margin 1em 0 border 1px solid black 但是当关
  • Powershell JSON 操作

    parent Property1 Property1Value Description Generic Description SubProperties SubSubTemplateProps SubSubSubTemplateProps
  • 多线程中cpu没有得到充分利用

    我正在为推荐引擎编写代码 该引擎使用并行线程进行计算 运行时 我在 8 核 CPU 上获得的最大 CPU 使用率为 265 300 使用 top 命令 我不明白的是 为什么即使有近 50 的 cpu 空闲 它也没有充分利用 CPU 使用并行
  • 使用c#在sql数据库中插入日期时间值

    如何将日期时间值插入到列类型为日期时间的 SQL 数据库表中 以下应该可行 并且是我的建议 参数化查询 DateTime dateTimeVariable some DateTime value e g DateTime Now SqlCo
  • 性能回归测试的最佳工具是什么[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们的组织正在寻找一种工具来帮助对每个版本进行性能测试 我们发布了一大堆新软件 我们希望确保自上次产品发布以来关键功能的性能没有下降 我们
  • 有什么方法可以从 WCF 服务应用程序创建 WSDL 文件吗?

    我正在创建一个 WCF 服务应用程序 我不想将 URL 提供给客户端使用 而是需要提供单个 WSDL 文件 我怎样才能做到呢 如果您需要 svcutil 将生成它 查看http msdn microsoft com en us librar
  • 如何将浮点数转换为人类可读的分数?

    假设我们有0 33 我们需要输出1 3 如果我们有0 4 我们需要输出2 5 我们的想法是使其具有可读性 让用户能够理解 y 中的 x 部分 作为理解数据的更好方式 我知道百分比是一个很好的替代品 但我想知道是否有一种简单的方法可以做到这一