如何准确地将浮点数转换为分数?

len*_*rdv 5 floating-point rust

我正在搜索如何将浮点数转换为最简单的分数,然后再转换回它,并找到了这个答案

问题是,给出的 Python 实现依赖于as_integer_ratiopython 标准库中的工具,而 Rust 中不存在该工具。我在评论中询问了这一点并发现了这一点,f64::frexp但我不确定我是否理解它是如何工作的,因为它的文档非常神秘(至少对我来说):

将数字分解为标准化分数和以 2 为底的指数,满足:
self = x * 2^exp
0.5 <= abs(x) < 1.0

最重要的是,它是一个不稳定的功能。

我应该怎么办?

Pas*_*uer 1

浮点数到分数转换的复杂之处在于,所有浮点数都已经是具有二次方分母的有理数,但这可能不太有用。您正在寻找的是“最佳有理近似”,以在某个最大分母内找到最接近目标浮点值的有理数。

该算法(在链接中描述)背后有一些巧妙的连分数数学,但放入代码中并不太难。这是一个实现它的小型 C 库:

使用示例:

#include "number_util.h"

int numerator;
int denominator;
RationalApproximation(M_PI, 1000000, NULL, &numerator, &denominator);
printf("%d/%d\n", numerator, denominator); 
// Prints: 3126535/995207 (= 3.14159265...)
Run Code Online (Sandbox Code Playgroud)

希望这可以直接移植或包装以在其他语言中使用。