`

关于计算精度

 
阅读更多

    本文是Sam我总结的,在C++学习过程中常见的一些涉及计算精度的问题,可谓明察秋毫之作!

 

1. 计算过程使用高精度类型(如,double),转型(如,最终结果转换为int)放在最后一步完成

 

举例:(最少乘法次数,C++)

/*
题目描述:

给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。
如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次。
  211:2*2=22(第一次乘),22*22=24(第二次乘)24*24=28(第三次乘)28*22=210(第四次乘)210*21=211(第五次乘)所以最少共5次。

输入
第一行m表示有m(1<=m<=100)组测试数据;
每一组测试数据有一整数n(0<n<=10000);
 
输出
输出每组测试数据所需次数s;

样例输入
3
2
3
4

样例输出
1
2
2

-----------------------------------------------------------------

解题方法:

每次寻找小于等于n的最大的2k的值,如11,先找23=8,然后以此类推。

则可以转换为二进制计算。

其算法类似于把一个十进制数转换为二进制。只要把最高位1转换的次数记下来,再加上这个二进制其它为1的位的个数。例如:
(14)10=(1110)2
最高位的1需要转换3次,所以计算14次方需要3+2(其它为1的位数)=5次。
(100)10=(1100100)2
最高位的1需要转换6次,所以计算100次方需要6+2(其它为1的位数)=8次。

此算法关键在于最高位1转换的次数。(2倍增长是速度最快!)只要算出最高位的1,则低位的1已经被全部算出。因为最高位的1是通过1+1=2 2+2=4 4+4=8 8+8=16……算出来的,则最高位转换次数算出后,其他为1的位只是在使用的时候加一次。(二分思想)
*/
#include <iostream>
#include <cmath>
using namespace std;

int countOne(int n){
    int cnt=0;
    while(n>0){
        n-=(n&(-n));
        cnt++;
    }
    return cnt;
}

int main(){

    int cases;
    cin>>cases;
    
    while(cases--){
        int n;
        cin>>n;
        
        //提高计算精度:
        //   计算全过程使用double,只最终进行一次int转型.
        //   尽量不要将中间结果转换成int
         
        cout<< log((double)n)/log(2.0) + countOne(n)-1 <<endl;  //当n=8时,输出3(正确) 
        
        //cout<< (int)( log((double)n)/log(2.0)) + countOne(n)-1<<endl;  //当n=8时,输出2(错误)
    }

    system("pause");
    return 0;
}
 

2.无穷迭代,判断是否收敛:引入最小误差项eps

 

举例:(泰勒级数计算正弦值,C++)

/*
  利用泰勒(Taylor)級數展開式,三角正弦函數sin(x)=x – ((x^3)/3!) + ((x^5)/5!) – ((x^7)/7!) + ((x^9)/9!) - ……
  設計一程式,輸入角度0-360度(必須轉換為弳度),計算其sin值。
*/
#include <iostream>
using namespace std;

const double eps=1e-15; //最小误差项
const double pi=3.14159265358979323846;

int main(){
    double angle;    //角度
    double x;         //(对应)弧度 
    double ans1, ans2;      //ans1: 本次结果, ans2:上次结果
    double numerator;       //分子
    double denominator;     //分母
    
    cout<<"Please input the angle: ";
    cin>>angle;
    x=angle/180*pi;
    
    //写代码时,先写下面do...while()循环,再来写这三个初始化值,不易出错 
    ans1=x;
    numerator=x;
    denominator=1.0;
    
    int i=2;
    do{
        ans2=ans1;
        numerator*=-x*x;
        denominator*=( i*(i+1) );
        
        ans1=ans2+ numerator/denominator;
        
        i+=2;
    }while(ans1-ans2>eps || ans2-ans1>eps);
    
    //cout<<"res="<<ans1<<endl;
    printf("sin(%.2lf) = %.6lf\n",angle, ans1);
    
    system("pause");
    return 0;
}

 

3.double类型指定精度输出

 

举例:(见上例,C++)

double angle=...
double ans1=...

//小数点后w位的double类型输出: printf("%.wlf",d);
printf("sin(%.2lf) = %.6lf\n",angle, ans1);
 

 

分享到:
评论

相关推荐

    计算机精度问题(Double)

    本文主要探讨的是“计算机精度问题”,特别是关于双精度浮点数(Double)的表示和计算中可能出现的问题。 双精度浮点数(Double)在计算机中通常按照IEEE 754标准进行存储和运算,它提供了大约15到16位的有效数字,...

    详解iOS之关于double/float数据计算精度问题

    iOS 之关于 double/float 数据计算精度问题详解 iOS 开发中,double 和 float 数据类型的计算精度问题是一个常见的问题。本篇文章将详细介绍 iOS 中 double/float 数据计算精度问题的根源、解决方案和高精度计算...

    Matlab_Sinulink仿真性能与计算精度设置方法的研究.pdf

    从给定的文件信息来看,文档标题为《Matlab_Sinulink仿真性能与计算精度设置方法的研究.pdf》,该文档是一篇关于Matlab和Simulink仿真技术的专业论文,主要探讨如何通过不同的设置方法来提高仿真性能和计算精度。...

    PDE.rar_一阶计算精度_欧拉时间步

    标题"PDE.rar_一阶计算精度_欧拉时间步"所指的内容是关于偏微分方程(Partial Differential Equation, 简称PDE)数值解的教程,具体使用了一阶精度的时间步进方法——欧拉方法(Euler Method)。在计算机科学和工程...

    高精度计算源码

    2. **computational mathematics.txt**:这可能是一个关于计算数学的文档,详细介绍了HugeCalc所采用的算法和理论基础,如大数算法、高精度浮点运算方法等。 3. **WhatsNew.txt**:这份文件很可能列出了HugeCalc的...

    C++实现pi的任意精度计算

    这是一份关于π的任意精度计算的C++实现源代码.算法是基于二次收敛算法,即AGM(几何平均数)方法,该算法也可应用于计算椭圆积分和以先进的ADI算法实现椭圆偏微分方程. (速度可能优于Mathematica!!!)

    论文研究 - Rasch模型假设条件测试的幂函数的计算精度

    Draxler和Zessin [1]推导了一类假设为Rasch模型的心理测验模型的条件测试的功效函数,并建议了由Verhelst [2]开发的MCMC方法,用于对功效的数值近似。... 关于计算时间的问题,必须考虑将Verhelst方法更有效。

    C#中处理多位小数精度的精度问题

    4. **使用高精度库**:如果`decimal`的精度仍不足以满足需求,可以考虑使用第三方库,如`System.Numerics.BigInteger`或者专门的高精度计算库。 5. **控制计算顺序和舍入策略**:通过调整计算顺序或应用特定的舍入...

    高精度计算 高精度加减乘除法

    根据给定文件的信息,我们可以总结出以下关于高精度计算(包括加法、减法、乘法和除法)的相关知识点: ### 1. 高精度计算简介 在计算机科学领域,传统的整数类型如 `int` 或 `long long` 等只能表示一定范围内的...

    RTKlib关于高精度GPS动态定位函数与处理过程整理

    RTKLIB 关于高精度 GPS 动态定位函数与处理过程整理资源提供了详细的函数调用流程图和处理过程,涵盖了文件读取、计算基站位置、卫星位置、双差、卡尔曼滤波和模糊度估计等知识点,为相关开发者和研究人员提供了有...

    c++实现π的任意精度计算

    这是一份关于π的任意精度计算的C++实现源代码.算法是基于二次收敛算法,即AGM(几何平均数)方法,该算法也可应用于计算椭圆积分和以先进的ADI算法实现椭圆偏微分方程. (运行速度可能快于Mathematica哦)

    RTKlib关于高精度GPS动态定位函数与处理过程整理.rar_GPS动态定位_RTKLIB GPS_rtklib_动态定位_高

    精密GPS动态测量采用载波相位差分技术,其标准测量模式...本文主要介绍用RTKLIB 实现精密动态定位的过程,该过程包括观测文件和导航文件的读取、基准站位置的计算、流动站位置的求解、运行结果的输出,下面将分块讨论。

    关于深度相机的精度问题1

    【深度相机原理与精度分析】 深度相机是一种能够捕捉三维空间信息的设备,广泛应用于机器人导航、虚拟现实、增强现实、3D扫描等领域。常见的深度相机技术主要包括基于主动投射结构光、双目视觉和光飞行时间法(ToF...

    关于浮点数的精度问题

    "关于浮点数的精度问题" 浮点数精度问题是一个经典的问题,对于了解和学习C语言有一定帮助。浮点数的精度问题是由于计算机对浮点数的存储方式和表示方法所致。 IEEE754 的浮点数存储格式对浮点数的表示方法进行了...

    第1章 高精度计算-2019-02-19

    ### 高精度计算知识点 #### 1. 高精度计算背景及意义 高精度计算是在计算机科学领域中解决...以上就是关于高精度计算的一些基本概念和技术要点,通过这些方法,可以有效地解决传统数据类型无法解决的大数运算问题。

    javascript避免数字计算精度误差的方法详解

    标题所提到的知识点是关于在JavaScript编程语言中,如何处理和避免在进行数字计算时出现的精度误差问题。这个问题是数字在以浮点数形式存储时,因为计算机的存储架构是以二进制为基础的,导致一些十进制小数在二进制...

    基于MATLAB的GNSS卫星位置的计算及精度分析_GPSmatlab_GNSS_星历文件matlab_

    这些文件通常包含关于卫星的轨道参数,如位置、速度、健康状态等,以帮助接收机计算其相对于卫星的位置。在MATLAB中,我们需要编写脚本来读取这些'n'文件,将其中的二进制数据转换为可操作的轨道元素。 接下来,...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

    关于GLONASS卫星位置的计算,由广播星历进行计算,精度达到0.5m,我的原创

    利用广播星历进行计算GLONASS卫星位置,精度达到0.5m。利用matlab编写的,有详细说明。

Global site tag (gtag.js) - Google Analytics