我正在为了好玩而实现自己的编程语言,并一直在尝试实现各种浮点数类型。我想考虑实现一种表示复数的数字类型。
i) 我已经阅读了相关资料,我的理解是没有类似于IEEE-754标准(定义实数的标准浮点表示)的符合复数的标准。 这是否正确,或者我错过了什么?
ii) 所有我所知道的编程语言通过存储成对的(单精度或双精度)浮点数来实现复数类型,这些浮点数代表复数 $x + iy$ 的直角坐标形式。是否有人知道有采用其他方法的编程语言呢?
我想考虑实现一种以极坐标形式 $re^{i\theta}$ 表示复数的数字类型,将 $r$ 存储为 无符号 浮点数,将 $\theta$ 存储为 0 到 1 之间的无符号定点数。这可能是非常非标准的事情(但请记住,我只是为了好玩而做编程语言)。据我所知,有非常少的设置使用无符号浮点数,但感觉这是它们的一个适当的用途。我希望将 $\theta$ 存储为定点数,以便在原点周围得到均匀的分布。
是否有人了解这种选择的数值结果方面的工作?例如:在典型的数学工作流程中,复数的加法与乘法相对重要(直角坐标形式更容易进行加法运算,极坐标形式更容易进行乘法运算)?在精度和准确性方面,如何选择极坐标表示会有什么影响?是否有参考资料可以提供给我呢?
NB-请注意,我不关心这些数字类型是否存在任何硬件支持。由于我是出于好玩而做的语言,因此我愿意通过软件实现它们以作为学习练习。
最后,是否有人有关于如何处理复数等效版本的 Inf
的建议呢?
theta
本质上应该是一个整数,表示“罗盘”方向。例如,使用 4 位整数,您将有2 ** 4 = 16
种不同的方向。当然,您需要像 64 位这样的东西,而不仅仅是 4 位,但原则是相同的。您的r
可以是普通的 IEEE 浮点数,您只需忽略符号位即可。关于无穷大的算术问题,请参见例如 黎曼球 § 算术运算。 - Jeppe Stig Nielsenstd::complex<int>
。 - phuclv