<分区>
在为基本数学数字集(自然数、整数、有理数、无理数、虚数、复数)编写自己的实现代码时,我遇到了一个有趣的难题。我想在代码中正确表示数字,但我不知道。我需要你的想法,方法来实现它。我认为基类应该是复数。从复数(作为子集)导出的实数和虚数。从实数派生的有理数和无理数。从有理数派生的整数。类中的私有(private)成员应该是什么?无理数如何表示?有伪代码吗?
标签 java c++ inheritance math
<分区>
在为基本数学数字集(自然数、整数、有理数、无理数、虚数、复数)编写自己的实现代码时,我遇到了一个有趣的难题。我想在代码中正确表示数字,但我不知道。我需要你的想法,方法来实现它。我认为基类应该是复数。从复数(作为子集)导出的实数和虚数。从实数派生的有理数和无理数。从有理数派生的整数。类中的私有(private)成员应该是什么?无理数如何表示?有伪代码吗?
最佳答案
这是一个相当基于意见的问题。但是,我想说你提出的模型不能很好地扩展到其他代数,例如四元数、双复数等,其中许多是互斥的。例如,四元数和 tessarines 都是四维的,但它们是不兼容的——那么它们在类层次结构中的位置呢?复数与两者兼容,但扩展它们没有意义。维度 > 4 的 Clifford 代数与维度 > 4 的 Cayley-Dickson 代数不兼容,依此类推。
您可能想了解 C++ 和其他语言中的各种标准库如何表示数字。例如,查看 Objective-C 中的 java.lang.Number
、NSNumber
等。通常,有一个基类沿着以下几行提供转换方法:
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;
}
然后您可以使用 double
、my_scalar
、my_double
或任何您想要的参数化类型。
您可以为四元数等定义类似的类。
关于java - 使用类型继承的数字组层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268675/