复杂的浮点类型
Complex floating point types
我正在实现我自己的编程语言是为了好玩,并且一直在尝试各种浮点数字类型的实现。我想考虑实现一个数字类型来表示复数。
i) 我一直在阅读,我的理解是复数没有等效的 IEEE-754 标准(它定义了实数的标准浮点表示)。 这是正确的,还是我漏掉了什么?
ii) 我所知道的所有编程语言都通过存储一对(单精度或双精度)浮点数来实现复杂类型,浮点数表示复数 $x + 的笛卡尔形式我$。 是否有人知道一种以不同方式做事的编程语言?
我想考虑实现一个以极坐标形式 $re^{i\theta}$ 表示复数的数字类型,将 $r$ 存储为 unsigned 浮点数和 $\theta$ 作为 0 和 1 之间的无符号定点数。这将是一件非常不标准的事情(但请记住,我只是为了好玩而编写我的编程语言)。据我所知,有 very few 设置使用无符号浮点数,但感觉这对它们来说是合适的用途。我希望将 $\theta$ 存储为定点,以便在原点周围均匀分布。
有人知道对这种选择的数值结果所做的任何工作吗?例如:在典型的数学工作流程中,复数的加法与乘法的相对重要性是什么(笛卡尔形式的加法更容易,极坐标形式的乘法更容易)?就数值精度和准确度而言,选择极坐标表示有何影响? 有没有任何人可以指点我的参考资料?
注意 - 请注意,我对这些数字类型是否存在任何硬件支持不感兴趣。由于我学习语言是为了乐趣,所以我很乐意将软件中的事情作为一种学习练习。
最后 - 有人对 Inf
的复杂等价物应该如何表现有任何建议吗?
要记住的一件事是,虽然极坐标表示中的乘法在某种程度上比笛卡尔乘法快 2 倍,但极坐标中的加法比笛卡尔中的加法慢得多。在 C 中,代码编译为 -O3 我看到极坐标中的加法比笛卡尔加法慢 250 倍左右。这是因为要进行加法运算,您必须首先转换为笛卡尔坐标,这是对 sin() 和 cos() 的两次调用,然后相加然后转换回极坐标,这是对 hypot(或至少是 sqrt)的调用和 atan2.
至于各种操作用了多少,就不好说了。如果您要进行矩阵和向量运算(复杂的矩阵在物理和电气工程中都很常见),那么我猜加法和乘法的输入差不多。
我正在实现我自己的编程语言是为了好玩,并且一直在尝试各种浮点数字类型的实现。我想考虑实现一个数字类型来表示复数。
i) 我一直在阅读,我的理解是复数没有等效的 IEEE-754 标准(它定义了实数的标准浮点表示)。 这是正确的,还是我漏掉了什么?
ii) 我所知道的所有编程语言都通过存储一对(单精度或双精度)浮点数来实现复杂类型,浮点数表示复数 $x + 的笛卡尔形式我$。 是否有人知道一种以不同方式做事的编程语言?
我想考虑实现一个以极坐标形式 $re^{i\theta}$ 表示复数的数字类型,将 $r$ 存储为 unsigned 浮点数和 $\theta$ 作为 0 和 1 之间的无符号定点数。这将是一件非常不标准的事情(但请记住,我只是为了好玩而编写我的编程语言)。据我所知,有 very few 设置使用无符号浮点数,但感觉这对它们来说是合适的用途。我希望将 $\theta$ 存储为定点,以便在原点周围均匀分布。
有人知道对这种选择的数值结果所做的任何工作吗?例如:在典型的数学工作流程中,复数的加法与乘法的相对重要性是什么(笛卡尔形式的加法更容易,极坐标形式的乘法更容易)?就数值精度和准确度而言,选择极坐标表示有何影响? 有没有任何人可以指点我的参考资料?
注意 - 请注意,我对这些数字类型是否存在任何硬件支持不感兴趣。由于我学习语言是为了乐趣,所以我很乐意将软件中的事情作为一种学习练习。
最后 - 有人对 Inf
的复杂等价物应该如何表现有任何建议吗?
要记住的一件事是,虽然极坐标表示中的乘法在某种程度上比笛卡尔乘法快 2 倍,但极坐标中的加法比笛卡尔中的加法慢得多。在 C 中,代码编译为 -O3 我看到极坐标中的加法比笛卡尔加法慢 250 倍左右。这是因为要进行加法运算,您必须首先转换为笛卡尔坐标,这是对 sin() 和 cos() 的两次调用,然后相加然后转换回极坐标,这是对 hypot(或至少是 sqrt)的调用和 atan2.
至于各种操作用了多少,就不好说了。如果您要进行矩阵和向量运算(复杂的矩阵在物理和电气工程中都很常见),那么我猜加法和乘法的输入差不多。