C++如何实现指数运算

caocheng8230 2010-07-17 09:34:16
在MATLAB等数学软件中,x^y或者x**y都表示C中的pow(x,y)的功能
但是如果想移植MATLAB中的这些指数运算到C/C++中就显得非常麻烦,得手动进行转换

有没有一种好的办法,比如定义一种宏或者函数,可以替换x^y或者x**y这种形式实现C/C++中的指数运算功能?

谢谢!

(注:在C/C++中不能对内在的int,double等类型定义重截操作符)
...全文
5598 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
caocheng8230 2010-07-17
  • 打赏
  • 举报
回复
其实我觉得也是无所谓的,就是在转换的过程中想到的这个需求,谢谢上面大家的回答。
arong1234 2010-07-17
  • 打赏
  • 举报
回复
我估计C++用于数学运算的不足1%,而这1%中需要你这样编程就从matlab拷贝过来的不到万分之1,所以你这个所谓的“基本”要求可能只有百万分之一的可能性需要
arong1234 2010-07-17
  • 打赏
  • 举报
回复
对你这个特殊的用例也许是很基本的,但是C++出现并不是为数学运算而出现的,而是一个非常通用的语言,这就是它和matlab不一样的地方!所以这并不是C++所需要的“基本”运算!而且这个运算通过pow完全可以做到,你遇到问题完全是你需要从matlab文件移植而不想做任何事情而导致的,这需求本身就是稍微不合理的。跨语言移植想文本操作就达到目标,你觉得现实么?
[Quote=引用 11 楼 caocheng8230 的回复:]

这种方法谁不知道?就是一个数的封装类而已,在计算时,每一个数都得转换成这样的类不觉得累么?

还是希望C++的编译器什么时候能够内置这样的操作符。(并且这个操作也是非常基本呀)

还有就是在C++(非)标准库中好像也一起没有这样的操作符出现,可能很多人并不觉得这是个问题吧。
[/Quote]
caocheng8230 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wyz007134 的回复:]
C/C++ code
#include <iostream>
#include <cmath>
using namespace std;
template<class T>
class CNum
{
public:
T m_elem;
CNum(T elem);
T operator^(CNum &other);
};

templ……
[/Quote]

这种方法谁不知道?就是一个数的封装类而已,在计算时,每一个数都得转换成这样的类不觉得累么?

还是希望C++的编译器什么时候能够内置这样的操作符。(并且这个操作也是非常基本呀)

还有就是在C++(非)标准库中好像也一起没有这样的操作符出现,可能很多人并不觉得这是个问题吧。
arong1234 2010-07-17
  • 打赏
  • 举报
回复
我不觉得指数规则有那么难理解:)有那个大学生不知道指数运算的?[Quote=引用 9 楼 mskmc_mc 的回复:]
当然可以定义一个函数来处理,但问题是先搞明白指数运算规则
[/Quote]
mskmc_mc 2010-07-17
  • 打赏
  • 举报
回复
当然可以定义一个函数来处理,但问题是先搞明白指数运算规则
arong1234 2010-07-17
  • 打赏
  • 举报
回复
“全屏替换”?作为程序员,你应该写个程序进行全局替换,而不是用一个文本编辑器进行手工替换。

尽管如此,如果你一定要使用全局替换的话,你也可以通过运算符重载实现。虽然primative类型你无法使用运算符重载,但是你完全可以定义一个CDouble类完整包装double,然后实现a^b为指数即可。

注意:运算符重载是不允许支持系统没有预定义的运算符的,因此**是不可能支持的,你需要把**全局替换成^
[Quote=引用 4 楼 caocheng8230 的回复:]
引用 2 楼 hengshan 的回复:
你大概是想把数学表示转换为程序,可以自己写个生成代码的程序


你说对了,我就是想这样。

用maxima,maple,matlab等推导的公式有时占一个页面,如果手动转换是非常耗时耗力的,大多数地方都可以通过全屏替换的方式解决,但是对于像指数这样的只能手动一个一个进行转换,太累人了。
[/Quote]
wyz007134 2010-07-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <cmath>
using namespace std;
template<class T>
class CNum
{
public:
T m_elem;
CNum(T elem);
T operator^(CNum &other);
};

template <class T>
CNum<T>::CNum(T elem)
{
m_elem = elem;
}

template <class T>
T CNum<T>::operator^(CNum &other)
{
return (T)pow((double)m_elem, double(other.m_elem));
}

int main()
{
CNum<int> objInt1(5), objInt2(3);
int t = objInt1 ^ objInt2;
cout << t << endl;
CNum<double> objDbl1(3.5), objDbl2(1.5);
double d = objDbl1 ^ objDbl2;
cout << d << endl;
return 0;
}
arong1234 2010-07-17
  • 打赏
  • 举报
回复
我估计你必须自己转换。但是这些转换都是程序自动进行的,你只要一个程序支持x**y不就可以了?对于C++而言,你的表达式只是一个字符串而已,它又不会直接把你字符串执行[Quote=引用 4 楼 caocheng8230 的回复:]
引用 2 楼 hengshan 的回复:
你大概是想把数学表示转换为程序,可以自己写个生成代码的程序


你说对了,我就是想这样。

用maxima,maple,matlab等推导的公式有时占一个页面,如果手动转换是非常耗时耗力的,大多数地方都可以通过全屏替换的方式解决,但是对于像指数这样的只能手动一个一个进行转换,太累人了。
[/Quote]
wyz007134 2010-07-17
  • 打赏
  • 举报
回复
把内在类型int,double等封装成一个简单的结构或者类,然后重载操作符即可。
caocheng8230 2010-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hengshan 的回复:]
你大概是想把数学表示转换为程序,可以自己写个生成代码的程序
[/Quote]

你说对了,我就是想这样。

用maxima,maple,matlab等推导的公式有时占一个页面,如果手动转换是非常耗时耗力的,大多数地方都可以通过全屏替换的方式解决,但是对于像指数这样的只能手动一个一个进行转换,太累人了。
caocheng8230 2010-07-17
  • 打赏
  • 举报
回复
我先提供一种解决方法
找一个支持正则替换的编辑器,将需要转换的代码粘贴上去,然后查找所有x^y形式的代码然后以pow(x,y)进行替换,然后再复制到代码中,应该可以解决

但是这种方法得需要对正则表达式有一定了解才可以。

下面继续
hengshan 2010-07-17
  • 打赏
  • 举报
回复
你大概是想把数学表示转换为程序,可以自己写个生成代码的程序

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧