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

时间:2015-12-14 13:49:59

标签: java c++ inheritance math

我在编写自己的基本数学数字集(自然,整数,理性,非理性,虚构,复杂)时,遇到了一个有趣的难题。我想在代码中使用正确代表的数字,但我不知道。我想要你从想法,方法来做到这一点。我认为基类应该是复数。从复数(作为子集)导出的实数和虚数。从实数中得出的理性和无理数。整数来自有理数。班里的私人会员应该是什么?无理数如何代表?有没有伪代码?

3 个答案:

答案 0 :(得分:1)

这是一个基于意见的问题。但是,我会说你提出的模型并不能很好地扩展到其他代数,例如四元数,双复数等等,其中许多是相互排斥的。例如,四元数和tessarines都是四维的,但是不兼容 - 那么它们在哪里适合类层次结构?复数与两者兼容,但扩展它们并没有意义。 <维的Clifford代数> 4与尺寸> 1的Cayley-Dickson代数不相容。 4,等等。

您可能希望了解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或任何您想要的参数化类型。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

基本上有两种方法

  1. 首先将实数作为复数的特例进行建模等等......
  2. 或者你将它从最简单的模型建模到更复杂的模型,Eric Galluzzo在他的answer中描述了
  3. 您选择第一个还是第二个取决于您。

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