【问题标题】:C++ standard types extensionC++ 标准类型扩展
【发布时间】:2015-11-06 16:40:40
【问题描述】:

如果我想添加计算双精度绝对/相对误差的功能,我该怎么办?我可以简单地实现 MyDouble 类,它涵盖了所有的双功能并且可以执行这个特定的操作,然后用这种类型“替换”双吗?

(我想这样使用它:

  1. 写一些通常是double类型的代码

  2. 在我的文件开头添加一些头文件或写类似typedef double MyDouble

  3. 估计双精度值的错误,在我的代码中累积

  4. 删除我在第 2 点放入文件的内容

【问题讨论】:

  • 是的......虽然你不会完全“替换”双精度,而只是使用你的类型。
  • 更具体地说明您想要的双倍功能
  • 不,我想要另一个解决方案。例如,我有一个大代码,我想输入类似typedef double MyDouble 的东西来将double 替换为MyDouble。我不想为我的新类型重写像 sqrt/log/fabs 这样的函数......
  • 是什么阻止您使用外部函数而不是方法来计算它?
  • 这个问题有点the XY problem 的味道:您有一个解决方案,并希望我们的帮助使您的解决方案发挥作用,但您没有告诉我们您的解决方案打算实际解决什么。请告诉我们实际的根本问题,以及您尝试解决的问题,我们可以为您提供更好的帮助。

标签: c++ types double


【解决方案1】:

typedef 不足以拥有您自己的类。如果您需要累积错误、重载某些操作或定义其他成员,您当然需要一个成员来保存它们,并且还需要重载操作来定义错误传播规则。

这是一个开始:

class MyCDouble {
    double d; 
public: 
    MyCDouble(double x) : d(x) {}
    operator double() const { return d; }
    void analyze() {}; 
};

由于转换运算符和构造函数,您可以像使用双精度类一样使用此类。例如:

MyCDouble d = 3.14; 
MyCDouble e = sqrt(d); 
e.analyze(); 
cout << "sqrt of "<<d<<" is "<< e<<endl;
e = (d + 5)/3; 

现在,由您来添加错误管理和超载所需的内容。例如,您可以添加一个私有成员 double error;,并重载传播错误的操作。例如,您可以在类中添加:

 MyCDouble operator+ (MyCDouble x) {
     MyCDouble r = d+x; 
     r.error = max(r.error, x.error);  
     return r; 
 }

【讨论】:

  • 谢谢,我想这就是我要找的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2012-09-06
相关资源
最近更新 更多