任意精密包装

时间:2013-05-25 12:24:28

标签: c++ precision bigint arbitrary-precision

我遇到this任意精确包的问题。

我包含了“precisioncore.cpp”,声明为int_precision,试图编译它告诉我stdafx.h丢失了。

我已经读过,我可以在precisioncore.cpp中省略这个包含,所以我做了。之后它抱怨memcpy没有在这个范围内声明,所以我包含了。

我无法纠正的下一个错误:

\ precisioncore.cpp | 4222 |错误:调用重载'int_precision(float_precision&)'是不明确的|

这是第4222行:r2 =(int_precision)rf; r2是int_precision,rf是float_precision。我理解float被显式地转换为int,但是查看包附带的引用这应该不是问题,至少在语法方面是这样。

有没有人知道这个包裹?也许有同样问题的经历吗?

编辑:看起来这个包在Visual Studio中运行得很好。无法想象如何让它在C:B中运行,但是......

1 个答案:

答案 0 :(得分:0)

好吧...我在尝试将该库连接到GCC下的CodeBlocks时遇到了同样的问题。

在我看来,* int_precision(float_precision&)*构造函数未在* int_precision * class中的任何地方声明,这就是你得到该错误的原因。所以我不知道它如何在Visual Studio下工作。

无论如何,我的解决方案是自己添加构造函数:

iprecision.h 文件里面* int_precision *类旁边的其他构造函数声明添加:

int_precision( const float_precision& );

然后在 precisioncore.cpp 文件中的某处添加:

int_precision::int_precision( const float_precision& s )
{//note that behavior is similar to int(double) cast
 //int(9.99) yields 9; and int(-0.9) yields 0;
  if(s.exponent()<0)
      mNumber = ito_precision_string( int(0), true );
      //code taken from int_precision(int) constructor
  else
  {
      mNumber=s.get_mantissa();
      if(mNumber[0]=='-'||mNumber[0]=='+')
          mNumber.resize(s.exponent()+2);// +1.23456E2 = 123
      else
          mNumber.resize(s.exponent()+1);// 1.2345E2 = 123
  }
}

请注意,与其他构造函数不同,这个构造函数不能内联,因为它会在 iprecision.h fprecision.h 标头之间创建一个循环标头引用。这就是为什么实现必须在.cpp文件中。

希望这有帮助。