关于精度

来源:百度知道 编辑:互助问答吧 时间:2020/10/31 23:52:32
我用的VC编译器,处理一个数据(保存除法运算后的结果),定义为doucle型,最高显示到小数点后18位,请问有什么方法可以让他显示更多,比如上万?
谢谢大家,数组的方法我是知道的,我是写一个计算开方的程序,发现只能精确到18位,如果用数组,算法上实现对我是有难度的,谁能给个现成的例子么?

风骚的可乐——你的算法我明白,但是你可能没明白我的意思,我现在不是能不能开出来的问题,而是开出来后能保存到小数点后第几位的问题。。。

可能我说得不太清楚,我的意思是,开方的程序自己写,然后高精度保存开方结果,因为你需要高精度保存中间结果,然后用中间结果继续计算

自由的菜鸟——能给个例子么

你可以自己写一个能够执行任意精度计算的浮点数的类,以后不管你进行怎样的数值运算的时候都可以用,是可重用的.
比如你想计算e到100万位,或是PI到100万位,不可能每次你都单独实现,最好的办法是写一个超高精度浮点数类。
你可以参考这篇文章:
http://dev.csdn.net/author/housisong/edb08ff95b474fe9bad541a9722a2181.html

额 利用数组 重新写算法

呵呵 没有一种数据类型可以用于计算上万位的精度

#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;
}

sqrt(2) :

14142135623730950488016887242096980785696718753769480731766797379907324784621070
38850387534327641572735013846230912297024924836055850737212644121497099935831413
22266592750559275579995050115278206057147010955997160597027453459686201472851741
86408891986095523292304843087143214508397626036279952514079896872533965463318088
29640620615258352395054745750287759961729835575220337531857011354374603408498847
16038689997069900481503054402779031645424782306849293691862158057846311159666871
30130156185689872372352885092648612494977154218334204285686060146824720771435854
87415565706967765372022648544701585880162075847492265722600208558446652145839889
39443709265918003113882464681570826301005948587040031864803421948972782906410450
72636881313739855256117322040245091227700226941127573627280495738108967504018369
86836845072579936472906076299694138047565482372899718032680247442062926912485905
21810044598421505911202494413417285314781058036033710773091828693147101711116839
16581726889419758716582152128229518488472.

为什么开方用数组有难度?

开方不就是二分法么?

------------------------------
抄个例子:

比如136161这个数字,首先我们找到一个和136161的平方根比较接近的数,任选一个,比方说300到400间的任何一个数,这里选350,作为代表。
我们计算0.5*(350+136161/350)得到369.5
然后我们再计算0.5*(369.5+136161/369.5)得到369.0003,我们发现369.5和369.0003相差无几,并且,369^2末尾数字为1。我们有理由断定369^2=136161
一般来说能够开方开的尽的,用上述方法算一两次基本结果就出来了。再举个例子:计算469225的平方根。首先我们发现600^2<469225<700^2,我们可以挑选650作为第一次计算的数。即算
0.5*(650+469225/650)得到685.9。而685附近只有685^2末尾数字是5,因此685^2=469225
对于那些开方开不尽的数,用这种方法算两三次精度就很可观了,一般达到小数点后好几位。
实际中这种算法也是计算机用于开方的算法。

有意思。。学到不少呢~谢谢!

如果我知道算术上怎么算开方,我就能用计算机算出来,并且精确到任意精度。例如开方2,精确到小数点500位

double型精度只有16位,也就是有效数字只有16个,超出16个以后的数是无效的,是随机生成的,没有意义的.

如果你想获得更高精度,要自己另写程序,用更多存储单元来存一个数,也需要自己写加减乘除和函数运算程序.你可以自己写一个能够执行任意精度计算的浮点数的类,以后不管你进行怎样的数值运算的时候都可以用,是可重用的.
比如你想计算e到100万位,或是PI到100万位,不可能每次你都单独实现,最好的办法是写一个超高精度浮点数类。额 利用数组 重新写算法

呵呵 没有一种数据类型可以用于计算上万位的精度

#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;
}

sqrt(2) :

14142135623730950488016887242096980785696718753769480731766797379907324784621070
38850387534327641572735013846230912297024924836055850737212644121497099935831413
22266592750559275579995050115278206057147010955997160597027453459686201472851741
86408891986095523292304843087143214508397626036279952514079896872533965463318088
29640620615258352395054745750287759961729835575220337531857011354374603408498847
16038689997069900481503054402779031645424782306849293691862158057846311159666871
30130156185689872372352885092648612494977154218334204285686060146824720771435854
87415565706967765372022648544701585880162075847492265722600208558446652145839889
39443709265918003113882464681570826301005948587040031864803421948972782906410450
72636881313739855256117322040245091227700226941127573627280495738108967504018369
86836845072579936472906076299694138047565482372899718032680247442062926912485905
21810044598421505911202494413417285314781058036033710773091828693147101711116839
16581726889419758716582152128229518488472.