请教关于C/C++的超大数据计算的问题

whu_frank 2014-06-08 02:08:50
小弟我最近在做课程报告的时候遇到这个问题:
题目要求大致是求函数y=|sin(e^x)|在0--5120的DFT变换。
但是在一开始我就被卡住了,e^5120是个非常大的数据,一般64f的数据类型只能保存到e^700+左右,所以e^700--e^5120是不能直接进行存取的。我首先想到的是sinx是个周期为2π的函数,我可以将e^x减去一个非常大的数(N*2π),这样结果就可以直接保存然后参与正弦函数的运算。得到N的方法是:N=floor(f(x)/2π)。
于是我就把e^x用泰勒公式展开:e^x=∑(x^n)/n!,然后展开的每一项都减去N*2π,最后吧结果全部加起来就可以得到比较小的数。
但是。。。
e^5120这么大的数,泰勒公式展开的某一项都大到溢出了。。比方说e^5120展开到5120^500/500!的时候就已经溢出了,更别说做接下来的运算了。。
我知道C语言里大数据可以用字符串保存然后按位运算,但写个四则运算的算法还行,这可是指数函数啊,小弟我是没辙了,所以请假各位大神有没有什么好的解决方法。。。
...全文
315 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级能量泡泡 2014-06-09
  • 打赏
  • 举报
回复
e^x当x很大时的精度存在问题,sin(e^x)算不准
子夜一段星 2014-06-09
  • 打赏
  • 举报
回复
这个应该用数学方法解决。先化简后求职。不过高数老衲都基本忘光了
lm_whales 2014-06-08
  • 打赏
  • 举报
回复
引用 4 楼 whu_frank 的回复:
[quote=引用 2 楼 lm_whales 的回复:] y=|sin(e^x)| =sin(e^(fmod(x,2π))| 大概这么处理一下 2π =6.28。。。所以t = fmod(x,2π)在0~2π =0~6.28...之间 于是变成y=|sin(e^x)| =sin(e^(fmod(x,2π))|= sin(t); 这些很好计算了
朋友 ,你这个算法有问题吧,你确定sin(e^x)=sin(e^(fmod(x,2π))? 难道不应该是sin(e^x)=sin[(e^x)-2Nπ]吗?[/quote] 抱歉 确实考虑错误,不过既然求DFT 似乎应该不应该直接求值,应该用傅里叶级数计算才对吧 我觉得你的问题应该是 把 函数 y =|sin(e^x)| 展开为傅里叶级数,然后用DFT计算傅里叶级数。 原来那个想法确实是错误的
whu_frank 2014-06-08
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
y=|sin(e^x)| =sin(e^(fmod(x,2π))| 大概这么处理一下 2π =6.28。。。所以t = fmod(x,2π)在0~2π =0~6.28...之间 于是变成y=|sin(e^x)| =sin(e^(fmod(x,2π))|= sin(t); 这些很好计算了
朋友 ,你这个算法有问题吧,你确定sin(e^x)=sin(e^(fmod(x,2π))? 难道不应该是sin(e^x)=sin[(e^x)-2Nπ]吗?
lm_whales 2014-06-08
  • 打赏
  • 举报
回复
你这个和大数无关
lm_whales 2014-06-08
  • 打赏
  • 举报
回复
y=|sin(e^x)| =sin(e^(fmod(x,2π))| 大概这么处理一下 2π =6.28。。。所以t = fmod(x,2π)在0~2π =0~6.28...之间 于是变成y=|sin(e^x)| =sin(e^(fmod(x,2π))|= sin(t); 这些很好计算了
图灵狗 2014-06-08
  • 打赏
  • 举报
回复
大数运算需要自己专门构建,也可以用现有的GMP库,参考我的博文: http://blog.csdn.net/turingo/article/details/8249799

64,636

社区成员

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

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