如何在C语言中获得最大的十进制精度

如何在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,

在我的程序中,我用一系列不定项计算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, 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:您问错人了。我倾向于直言不讳:)