复杂浮点数类型

4

我正在为了好玩而实现自己的编程语言,并一直在尝试实现各种浮点数类型。我想考虑实现一种表示复数的数字类型。

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 Nielsen
1
在笛卡尔坐标系中,拥有像x+Iinf或Inf+Iy这样的数字可能非常有用,其中x和y是有限的。在极坐标表示中,这将是困难的。 - dmuir
@EricPostpischil 我错了。我记得在boost或类似的库中这样做过。在C++中,它是一个模板,因此肯定可以有std::complex<int> - phuclv
C99还有一个专门的“虚数”类型,用于表示没有实部的形式为$iy$的数字。但它的一般“复数”类型是通常的笛卡尔表示。 - dan04
1个回答

2
需要翻译的内容如下:

需要记住的一件事是,尽管在极坐标表示中进行乘法比在笛卡尔坐标系中快大约2倍,但在极坐标中进行加法比在笛卡尔坐标系中慢得多。在使用编译为-O3的C代码时,我发现在极坐标中进行加法比在笛卡尔坐标系中慢大约250倍。这是因为要进行加法运算,您必须先转换为笛卡尔坐标系,这需要调用sin()和cos()两次,然后相加,最后再转换回极坐标,这需要调用hypot(或至少sqrt)和atan2。

至于各种操作的使用频率有多大,很难确定。如果您将执行矩阵和向量运算(复杂矩阵在物理学和电气工程中都很常见),那么我猜加法和乘法的进入大约相等。


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