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

标签 java c++ inheritance math

<分区>

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

最佳答案

这是一个相当基于意见的问题。但是,我想说你提出的模型不能很好地扩展到其他代数,例如四元数、双复数等,其中许多是互斥的。例如,四元数和 tessarines 都是四维的,但它们是不兼容的——那么它们在类层次结构中的位置呢?复数与两者兼容,但扩展它们没有意义。维度 > 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 或任何您想要的参数化类型。

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

关于java - 使用类型继承的数字组层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268675/

相关文章:

c++ - SSE _mm_load_ps 导致段错误

c++ - 带有 operator()() 的虚拟关键字有意义吗? (仿函数)

java - 无法通过引用访问方法

java - 在 Android Studio 中检索 Firebase 数据到 ListView

c++ - HPET 的频率 vs CPU 频率用于测量时间

generics - Kotlin 用子类型覆盖 fun

css - 如何停止 CSS 继承?

java - 使用 iText 创建有角度的列标题

java - 如何在基于 JAVA 的 spring config 中配置 Hibernate Db 连接设置

c++ - 创建模板 TreeNodes 列表时出错