使用类型继承的数字组的层次结构



我在为基本的数学数字集(自然数、整数数、有理数、非有理数、虚数、复数)编码自己的实现时遇到了一个有趣的难题。我想要代码中正确表示的数字,但我不知道。我想让你从想法和方法中了解它。我认为基类应该是复数。从复数中导出的实数和虚数(作为子集)。有理数和无理数由实数派生而来。由有理数导出的整数。课堂上的私人成员应该是什么?无理数如何表示?有伪代码吗?

这是一个基于观点的问题。然而,我想说的是,你提出的模型并不能很好地扩展到其他代数,如四元数、双复数等,其中许多是互斥的。例如,四元数和镶嵌都是四维的,但不兼容——那么它们在类层次结构中的位置呢?复数与两者都兼容,但将两者都扩展是没有意义的。4维的Clifford代数与4维的Cayley-Dickson代数不相容,等等。

您可能想了解C++和其他语言中的各种标准库是如何表示数字的。例如,看看Objective-C中的java.lang.NumberNSNumber等。通常,有一个沿着以下行的基类,它提供转换方法:

class my_scalar {
public:
    virtual int as_int() = 0;
    virtual double as_double() = 0;
    virtual float as_float() = 0;
    virtual my_scalar operator+(const my_scalar &other) = 0;
    virtual my_scalar operator-(const my_scalar &other) = 0;
    // etc.
}

(请原谅我可能有问题的C++,它很生疏……)

然后,您可以定义表示标量的具体类型的子类:

class my_double : public my_scalar {
private:
    double value;
    ...
}
class my_rational : public my_scalar {
private:
    int num, denom;
}
...

如果您对任意精度的数字感兴趣,也可以将它们表示为my_scalar的子类(例如java.lang.BigDecimal或Python的Decimal)。

然后,对于非标量类型,我更喜欢组合而不是继承,因此:

class my_complex {
private:
    double re, im;
    ...
}

你甚至可以全力以赴,用标量类型参数化my_complex,例如:

template <class T>
class my_complex {
public:
    my_complex(const T& re, const T& im) { ... }
    T *modulus() { ... }
private:
    T *re, *im;
}

然后,您可以使用doublemy_scalarmy_double或任何您想要的参数化类型。

您可以为四元数等定义类似的类。

看看你选择的语言是如何编码数字的,也许你可以模仿它。

如果你想完全自己构建它,你可以从编码为位字符串或字节的自然数开始,然后用浮点表示法来表示实数(https://en.wikipedia.org/wiki/Floating_point)。你应该能够使用这两个来实现其他的(例如,整数有一个自然数和一个符号位,有理数有一个整数作为分子和一个自然数字作为分母,虚数使用无理数,复数使用有理数作为实部,虚数作为虚部)。这当然只是一种可能的实现方式!有许多已知的改进。如果你真的想全力以赴,我建议你看看这个问题:在Java中,整数是如何在位级别进行内部表示的?

基本上有两种方法

  1. 首先,你将实数建模为复数的一个特例,以此类推
  2. 或者你把它从最简单的模型变成更复杂的模型,就像埃里克·加卢佐在回答中描述的那样

选择第一名还是第二名取决于您。

Java中的问题可能是实数是连接数或有理数和无理数,但在Java中,每个类只有一个父类。。。

最新更新