如何在C语言中获得最大的十进制精度
在我的程序中,我用一系列不定项计算Pi。当我显示结果计算时,Pi的总体精度不是我想要的。我相信我使用的转换规范或基本类型中存在问题 以下是我得到的: Pi:3.141594 以下是我想要的: Pi:3.14159265358979323846 以下是我的Pi计算方法中的一些代码:如何在C语言中获得最大的十进制精度,c,pi,C,Pi,在我的程序中,我用一系列不定项计算Pi。当我显示结果计算时,Pi的总体精度不是我想要的。我相信我使用的转换规范或基本类型中存在问题 以下是我得到的: Pi:3.141594 以下是我想要的: Pi:3.14159265358979323846 以下是我的Pi计算方法中的一些代码: //Global variables // Variables to hold the number of threads and the number of terms long numOfThreads,
//Global variables
// Variables to hold the number of threads and the number of terms
long numOfThreads, numOfTerms;
// Variable to store the pieces of Pi as it is being calculated by each thread
double piTotal = 0.0;
// Use an indefinite series of terms to calulate Pi
void calculatePi(){
// Variable to store the sign of each term
double signOfTerm = 0.0;
// Variable to to be the index of the loop variable
long k;
#pragma omp parallel for num_threads(numOfThreads) \
default(none) reduction(+: piTotal) private(k, signOfTerm)\
shared(numOfTerms)
for (k = 0; k <= numOfTerms; k++) {
if (k == 0) {
signOfTerm = 1.0;
}
// Sign of term is even
else if (k % 2 == 0) {
signOfTerm = 1.0;
}
// Sign of term is odd
else if (k % 2 == 1) {
signOfTerm = -1.0;
}
// Computing pi using an indefinite series of terms
piTotal += (signOfTerm) * 4 / (2 * k + 1);
}
}
// Print the result
void printResult(){
printf("\n" "Calulation of Pi using %d " "terms: %f",numOfTerms,piTotal);
}
//全局变量
//用于保存线程数和术语数的变量
长numOfThreads,numOfTerms;
//变量来存储每个线程正在计算的Pi片段
双皮托塔尔=0.0;
//使用一系列不确定的术语来计算Pi
void calculatePi(){
//变量来存储每个术语的符号
双符号项=0.0;
//变量作为循环变量的索引
长k;
#用于num_线程(numOfThreads)的pragma omp parallel\
默认(无)缩减(+:piTotal)私有(k,signOfTerm)\
共享(numOfTerms)
对于(k=0;k这里是我解决问题所做的。我必须将转换规范从%f更改为%.17g。这比默认的float打印值精度更高
//打印结果
作废打印结果(){
//在小数删除尾随零后返回最多17位的结果
printf(“\n”“使用%d项的Pi值):%.17g”,numOfTerms,piTotal);
}
请注意,(k%2==0)将处理k==0的情况,因此不需要对k==0进行特殊检查。此外,该级数收敛速度非常慢,它是以下pi简单公式列表中的第一个:
pi/4=arctan(1)
pi/4=弧坦(1/2)+弧坦(1/3)
pi/4=4*arctan(1/5)-arctan(1/239)
pi/4=6*arctan(1/8)+2*arctan(1/57)+arctan(1/239)numOfTerms
的值决定了算法将执行的迭代次数,而不是小数位数!!!顺便说一句,真的没有必要抛出那堆“代码”在我们面前。大部分内容与手头的问题无关。请只发布相关部分,并尽量以有序、干净的方式发布(即,一点缩进不会造成任何伤害)。好吧,既然你以如此直截了当的方式描述了它,我允许自己稍微“不那么礼貌”(老实说,没有恶意,所以请尽量把它看作是一个建设性的评论)。你的代码看起来很糟糕。事实上,它看起来非常糟糕。缩进虽然是语义上的,但对代码的细节却很少关心。那些if/else
语句暗示了非常糟糕的逻辑思维。而且,正如我在前面的评论中提到的,numOfTerms
并不能确定输出中的小数位数。@KarolyHorvath:如果您认为我的回答(上面的两条评论)超出了合理范围,请告诉我。@barakmanos:您问错人了。我倾向于直言不讳:)