100分紧急求助~开方的高精度算法

xunyuetian 2005-06-17 09:46:03
要求精确到1000位以上的算法~
我是菜鸟~谢谢大家了
...全文
321 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xunyuetian 2005-06-23
  • 打赏
  • 举报
回复
晕~那个cryptlib如何使用呀~我下载了~编译好慢~而且不会用~
ChenJF206 2005-06-17
  • 打赏
  • 举报
回复
至于[0.0……0abc]的形式,可以转为[a.bc]*10n(n是幂)的形式就可以用上面的方式处理了,不过取有效数字稍有差异;另外负数的情况需要去负号再算,最后在首位前追加负号就OK了
ChenJF206 2005-06-17
  • 打赏
  • 举报
回复
1.用字符序列表示数a0...an,因为没有1000位的数据类型;
2.准备好字符序列数的基本运算函数,加、减、乘;
3.确定小数点位置,之后小数点不在参与运算;
4.j=0;
if 整数部分为奇数,取首一位a0来试平方根,即x0*x0<a0,x0为满足条件的最大根,i=0,
bi=a0-x0*x0;
else 取首两位试根[a0 a1],方法同前,i=1,bi=[a0 a1]-x0*x0;
j++;
5.每次往后取两位数字得[bi a(i+1) a(i+2)],若不足则补0,试根
20*[x0...x(j-1)]*xj+xj*xj<[bi a(i+1) a(i+2)],xj为满足条件的最大根,i+=2,j++;
6.重复5,直到获得足够的精度,或者[bi a(i+1) a(i+2)]为0为止;
7.根据之前确定的小数点位置插入小数点,完成。
xunyuetian 2005-06-17
  • 打赏
  • 举报
回复
实在太感谢了~
不过我是新手C++都还没有学,汗ing~

能否粗略讲一下算法,再推荐一些书籍
万分感谢~

  • 打赏
  • 举报
回复
sqrt(2) :

14142135623730950488016887242096980785696718753769480731766797379907324784621070
38850387534327641572735013846230912297024924836055850737212644121497099935831413
22266592750559275579995050115278206057147010955997160597027453459686201472851741
86408891986095523292304843087143214508397626036279952514079896872533965463318088
29640620615258352395054745750287759961729835575220337531857011354374603408498847
16038689997069900481503054402779031645424782306849293691862158057846311159666871
30130156185689872372352885092648612494977154218334204285686060146824720771435854
87415565706967765372022648544701585880162075847492265722600208558446652145839889
39443709265918003113882464681570826301005948587040031864803421948972782906410450
72636881313739855256117322040245091227700226941127573627280495738108967504018369
86836845072579936472906076299694138047565482372899718032680247442062926912485905
21810044598421505911202494413417285314781058036033710773091828693147101711116839
16581726889419758716582152128229518488472.
  • 打赏
  • 举报
回复
无聊地一个:

#include <iostream>
#include <cryptlib/integer.h>
#include <sstream>
using namespace std;
using namespace CryptoPP;

#define PREC 1000

int main( int argc , char* argv[] )
{
if( argc != 2 )
{
cout << "usage foobar <number>" << endl;
exit( 1 );
}

istringstream iss( argv[1] );
Integer nn , mm = 1 , mm2; iss >> nn;

for( int i = 0; i < PREC; ++i ) mm *= 10; mm2 = mm * mm; nn *= mm2;
cout << nn.SquareRoot() << endl;
}

69,390

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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