C++ 简化GiNaC表达式
我正在尝试做一些非常简单的事情:C++ 简化GiNaC表达式,c++,symbolic-math,ginac,C++,Symbolic Math,Ginac,我正在尝试做一些非常简单的事情: void断言(bool x){ 如果(!x) 抛出运行时_错误(“断言错误”); } #包括 int main(int argc,char*argv[]){ 断言(sqrt(ex(32))==4*sqrt(ex(2));//引发运行时错误 } 我想简化sqrt(32),这样它就等于4*sqrt(2)。当然,从数学的角度来看,情况确实如此,但基纳克并没有“意识到”这一点。文档中没有提到这些简化,我真的不知道这是否可能…假设sqrt返回一个浮点数,那么你不应该用=
void断言(bool x){
如果(!x)
抛出运行时_错误(“断言错误”);
}
#包括
int main(int argc,char*argv[]){
断言(sqrt(ex(32))==4*sqrt(ex(2));//引发运行时错误
}
我想简化
sqrt(32)
,这样它就等于4*sqrt(2)
。当然,从数学的角度来看,情况确实如此,但基纳克并没有“意识到”这一点。文档中没有提到这些简化,我真的不知道这是否可能…假设sqrt
返回一个浮点数,那么你不应该用=
运算符比较两个浮点数,因为由于计算机中浮点数的存储方式,它们只能处理有限的精度。阅读Internet@AlexLarionov我忘了添加一些东西;sqrt
函数接受ex
对象作为其参数,它们是符号表达式。您是否尝试过ex(32)=pow(4*sqrt(ex(2)),2)
?看看这是否有效?只是好奇ginac是否能处理好这件事;它并没有解决简化sqrt(ex(32))
@cigien的问题,因为某些原因它是有效的。。。rhs表达式的计算结果直接为ex(32)
。我猜pow
就是为了处理这个问题而编写的,但是sqrt
的计算结果并不是您所期望的。哪种方法有意义,可能有多种方法可以简化sqrt
。请注意,我只是在这里猜测,我以前从未与ginac合作过,而且似乎没有太多教程或任何东西。假设sqrt
返回一个浮点数,那么您不应该用=
运算符比较两个浮点数,因为由于计算机中浮点数的存储方式,它们只能处理有限的精度。阅读Internet@AlexLarionov我忘了添加一些东西;sqrt
函数接受ex
对象作为其参数,它们是符号表达式。您是否尝试过ex(32)=pow(4*sqrt(ex(2)),2)
?看看这是否有效?只是好奇ginac是否能处理好这件事;它并没有解决简化sqrt(ex(32))
@cigien的问题,因为某些原因它是有效的。。。rhs表达式的计算结果直接为ex(32)
。我猜pow
就是为了处理这个问题而编写的,但是sqrt
的计算结果并不是您所期望的。哪种方法有意义,可能有多种方法可以简化sqrt
。请注意,我只是在这里猜测,我以前从未与ginac合作过,而且似乎没有太多教程或其他内容。
void assert(bool x) {
if (!x)
throw runtime_error("Assertion error");
}
#include <ginac/ginac.h>
int main(int argc, char *argv[]) {
assert(sqrt(ex(32)) == 4 * sqrt(ex(2))); // Raises runtime_error
}