为什么分数数据类型通常不被实现?

4

我已经从事C/C++编程工作多年了。我也使用过其他几种编程语言,但没有一种内置分数数据类型。这里我不是指常规的十进制数据类型,如浮点型。我指的是具有以下形式的常规数学分数:

Nr/Dr(其中Dr≠0)

开发人员在实现此类数据类型时面临着哪些挑战?


3
附注:float 不是十进制数据类型,它是以二进制实现的。事实上,它对于表示小数非常糟糕,例如 1/10 没有精确的表示方式。 - Weather Vane
3
人们倾向于将分数作为支撑来避免考虑浮点精度问题,但最终他们会被分数的限制所困扰。当你需要任何基于近似的算法时(而数值计算中充满这种算法),无理数不适用,你很快就会耗尽精度,所有优势也随之消失。 - user2357112
1
实现有理数算术的一个问题是算术运算往往会增加分母:将1/4和1/3相加得到1/12。这可能会迅速使用于分母的整数类型溢出,并且防范它需要繁琐的运行时代码。当达到限制时,算术必须要么中断,要么改变为近似值。在那一点上,您基本上拥有了固定点或浮点算术的等效物,而没有什么实际成就。 - Eric Postpischil
1
此外,有理算术无法支持平方根、正弦、对数等等。可以执行的数学运算非常有限。 - Eric Postpischil
1
C语言的数据类型基本上是CPU可以直接使用的,以及结构体。C语言没有分数数据类型,因为你的CPU没有分数数据指令。(我认为这些通常被称为“有理数”而不是“分数”) - user253751
显示剩余8条评论
3个回答

5

开发人员在实现此类数据类型时面临的挑战是什么?

这不是因为它是一项挑战,而是因为在实践中它们并不那么有用。

无限精度有理数(即高精度小数)更加有用,但这意味着需要管理内存并使用智能算法来尽可能地提高性能。此时,您最好将功能实现为像GNU GMP和其它库一样的完整数学库,而不是内置类型。


5

内置数据类型往往是那些广泛使用的,且在底层架构上映射更加高效的数据类型。这不是一条硬性规定,但这是一个相当不错的经验法则。

小数数据类型则不然:它们本应是广泛有用的数据类型,但由于有限精度浮点类型已经足够满足99.9%的应用程序需求(如果您愿意也可以称为999/1000),并且由于具有硬件支持可以更有效地实现,并且因为它们代表了更广泛的数字域(即不仅仅是有理数运算),所以它们具有更少的理论和实际限制。

当存在特定应用需要超过浮点数据类型精度的任意精度有理数时,可以使用专门的库。但是在标准库中添加这些类型会浪费开发资源。

因此,从本质上讲,对于任何其他未被广泛实现为内置类型的专门数据类型,答案都是相同的。


1
浮点数实际上并不是很通用。所有浮点数都是有理数,但精度较低。 - user253751
1
@user253751 当然可以,但它们自然地代表近似值,并且应该如此。有理数的整个意义在于它们代表精确值,而不是近似值。一旦您使用它们来表示无理数的近似值,它们对有限精度浮点值的最后一个优势就不存在了。换句话说,有理分数数据类型预期表示有理数域。相比之下,浮点数据类型预期表示任意实数的近似值。 - Konrad Rudolph

2
开发人员在实现这些数据类型时面临的挑战是什么?
使用int可以做的一切都需要复制,这真的很繁琐。
fraction类型必须在您希望使用的所有库中广泛存在,否则您将不断在fraction和内置类型之间切换。

当前编程语言中分数的最大缺点是精度丢失。我指的是将分子和分母分别表示可以克服这种限制。例如,5/7=0.7142857… - user13088241
@RahulDixit 这将使分母的限制范围更大。浮点数可以在 float64 中具有从 1e-3081e+308 的范围,而类似大小的有理数将被限制在从 2e-104e9 的范围内。 - Ruslan
@Acorn:定点数并不能帮你表示5/7。 - user2357112
一个使用该功能的例子:打开 Android 的 Google 计算器。输入 14/6。它将显示十进制和分数形式的结果。2.33333... 和 7/3。 - user13088241
@user2357112supportsMonica 你需要记住重复部分的长度。 - Acorn
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接