精华内容
下载资源
问答
  • C语言浮点数

    万次阅读 多人点赞 2019-08-03 20:23:07
    浮点数的概念 浮点数也称小数或实数。... C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。 在任何区间内(如1.0 到 2...

     

    浮点数的概念

           浮点数也称小数或实数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。这是常见的小数的表现形式,称为十进制形式。

           C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。

           在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值,例如7.0可能被储存为浮点值6.99999。

    点用内存的情况

           我们先来测试一下float、double和long double三种浮点数据类型占用内存的字节数。

           示例(book71.c)

           

           运行结果

           

    浮点数的精度

           C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37。

           double类型和 float类型的最小取值范围相同,但至少必须能表示10位有效数字。

           long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。

           看了上面这段文字,估计大家有点晕,在之前的整数章节中,long比int的占用的内存多,存放数据的值也就越大,并且有一个准确的范围,但是,为什么各种浮点数存放数据的值怎么就这么模糊呢?我先不解释原因,浮点数的存储方式比较复杂,暂时不讨论,先用几个程序来测试一下它们的特征。

    1、测试float类型

           示例(book73.c)

           

           运行结果

           

           从程序的运行我们可以看出float数的两个特征:

           1)float数据类型表达的是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到8位的时候,误差了1,基本上不能用了。

           2)用“==”可以比较两个整数或字符是否相等,但是,看起来相等的两个浮点数,就是不会相等。

    2、测试double类型

           示例(book74.c)

           

           运行结果

           

           从程序的运行我们可以看出double数的两个特征:

           1)double数据类型表达的也是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到17位的时候,误差了1,基本上不能用了。

           2)用“==”可以比较两个double数值是否相等。

    3、测试long double类型

           示例(book75.c)

           

           运行结果

           

           long double的测试结果与double相同。

    4、测试总结

          float只能表达6-7位的有效数字,不能用“==”判断两个数字是否相等。

          double能表达15-16位有效的数字,可以用“==”判断两个数字是否相等。

          long double和double的特征相同。

          在实际开发中,建议弃用float,只采用double就可以,long double暂时没有必要,但不知道以后的操作系统和编译器对long double是否有改进。

    浮点数的输出

          float采用%f输出,double采用%lf输出,测试结果证明,double也可以采用%f输出。

          long double采用%Lf输出,注意,L是大写。

          %lf缺省显示小数点后六位。

          如果要显示小数点后n位,用%.nlf,例如:

          double ff=7.5;

          %.2lf  显示 7.50

          浮点数采用%lf输出,完整的输出格式是%m.nlf,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

    常用的库函数

          在接下来的内容中,我只介绍double,不再介绍float和long double两种数据类型相关的知识。

          以下是常用的浮点数函数,必须掌握。

          double atof(const char *nptr);       // 把字符串nptr转换为double

          double fabs(double x);               // 求双精度实数x的绝对值

          double pow(double x, double y);     // 求 x 的 y 次幂(次方)

          double round(double x);              // double四舍五入

          double ceil(double x);                 // double向上取整数

          double floor(double x);               // double向下取整数

          double fmod(double x,double y);     // 求x/y整除后的双精度余数

          double modf(double val,double *ip); // 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。

          还有一些数据计算函数,如正弦、对数、指数等,实际开发中极少使用,大家要用的时候再查资料,我就不介绍了。

    整数转换为浮点数

          我们先来看一个示例(book77.c):

           

          运行结果

           

          需要特别注意的是dd=ii/jj这一行代码,dd的值0,不是0.75,有点意外,所以,如果对整数转换为浮点数没有把握,加(double)强制转换是个好办法。

    应用技巧

          浮点数有一些坑,例如两个浮点数不相等和精度的问题,在实际开发中,我们经常用整数代替浮点数,因为整数是精确的,效率也更高。

          例如人的身高一米七五,以米为单位,用浮点数表示是1.75米,如果以厘米为单位,用整数表示是175。

          long整数的取值是-9223372036854775808~9223372036854775807,有效数字是19位,而double的有效数字才15-16位,所以,整数可以表达的小数更大的数,更实用,麻烦也更少。

          货币:1.75元,如果采用0.01元为单位就是175,采用0.001元为单位就是1750,如果你说要更多小数怎么办?你这是钻牛角尖。

          给大家说一个道,高水平的程序员不容易掉坑里,注意,是不容易,不是一定不会,最好的方法是没有坑。

    科学计数法

          在实际开发中,我们很少使用科学计数法,但是它经常出现在计算机系统中,例如浮点数在内存中的存放方式就是科学计数法,所以我们还是有必要学习科学计数法。

          科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,n为整数),这种记数法叫做科学记数法。当我们要书写或运算某个较大或较小且位数较多时,用科学记数法免去浪费很多空间和时间。

          例如:51400000000=5.14×1011。计算器或电脑表达10的幂是一般是用E或e,也就是51400000000=5.14E11或5.14e11。

          用科学记数法表示数时,不改变数的符号,只是改变数的书写形式而已,可以方便的表示日常生活中遇到的一些极大或极小的数 。如:光的速度大约是300,000,000米/秒;全世界人口数大约是:6,100,000,000。

          这样的数,书写和显示都很不方便,我们可以免去写这么多重复的0,将其表现为这样的形式:6,100,000,000=6.1×109,即6.1E9或6.1e9。

          或:0.00001=1×10-5,即绝对值小于1的数也可以用科学记数法表示为a乘10 的负n次方的形式。即1E-5或1e-5。

          科学计数法采用%e或%E输出,完整的输出格式是%m.ne或%m.nE,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

          示例(book78.c):

           

          运行结果

           

     

    版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net

    作者:码农有道

    如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

    如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

     

    展开全文
  • C语言浮点数探析

    2018-04-11 17:18:06
    C语言浮点数探析
  • 一种对C语言浮点数进制转换的处理方法目前,C语言采用IEEE 754浮点数运算标准,致使在进行浮点数进制转换时,会产生精度错误,这些错误直接导致转换失败。故本文提出(本文共2页)阅读全文>>针对当前分支混淆方法仅...

    一种对C语言浮点数进制转换的处理方法

    目前,C语言采用IEEE 754浮点数运算标准,致使在进行浮点数进制转换时,会产生精度错误,这些错误直接导致转换失败。故本文提出

    (本文共2页)

    阅读全文>>

    针对当前分支混淆方法仅对整数比较分支有效的缺陷,该文分析浮点数二进制表示与大小比较的关系,证明了浮点数二进制区间的前缀集合与浮点数区间内数据之间具有前缀匹配关系。使用哈希函数对前缀集合进行保护,...

    (本文共8页)

    阅读全文>>

    请编一程序,输入一由浮点数及+,-,*,/及小话号组成的表达式...

    (本文共1页)

    阅读全文>>

    以LCC软件为设计基础,提出了双精度浮点数比较大小算法的设计方法,通过程序验证了算法的...

    (本文共4页)

    阅读全文>>

    浮点数运算存在精度方面、比较方面以及舍入误差等方面的问题,而这些问题直接影响到科学计算的准确性、可靠性和安全性等等。...

    (本文共4页)

    阅读全文>>

    随着超级计算机的迅猛发展,高性能计算技术面临着巨大的挑战。由于绝大部分计算机均使用浮点运算标准,在大规模问题中,减弱舍入误差对数值计算产生的影响显得尤为重要。本文以向前向后误差分析理论、动态误差分析理论、无误差变换技术和双倍双精度基本算术运算为基础,提出了几种基于多部分格式的补偿算法,包括商-差算法、Clenshaw-Smith算法、Barrio-Clenshaw-Smith算法、Horner算法与Volk-Schumaker算法,并给出了它们的误差分析、数值实验与应用。本文还开发了C语言、Matlab与Scilab平台上的几种基于多部分格式的高精度算法库。本文的主要工作可分为如下三个部分:(1)第一部分(第2章)对商-差算法进行了稳定性分析,并设计了补偿的商-差算法。商-差算法可以应用到亚纯函数求极点、多项式求根、páde逼近和特征值问题等,但是它非常不稳定。本文提出了商-差算法的条件数,利用无误差变换与补偿除法运算设计了补偿...

    (本文共183页)

    本文目录 |

    阅读全文>>

    展开全文
  • c语言浮点数高精度加法计算
  • C语言 浮点数

    2015-05-12 10:49:47
    在有些嵌入式项目中,我们需要保存一些浮点数的系数,针对这些系数的处理,我们就要用到C语言浮点数相关的知识,自己对这方面也是知其然不知所以然,借此机会总结记录一下。 二:疑问 1,浮点数在计算机中是如何...

    一:起因

    在有些嵌入式项目中,我们需要保存一些浮点数的系数,针对这些系数的处理,我们就要用到C语言中浮点数相关的知识,自己对这方面也是知其然不知所以然,借此机会总结记录一下。

    二:疑问

    1,浮点数在计算机中是如何保存的?
            2,这些数据精确度到底都是多少?
            3,浮点数中的无穷大、无穷小是怎么表示
            4,为什么有时候针对浮点数运算,得到的结果不是我想要的呐?

    三:解说

    在网上搜到了一篇比较好的文章,可以解释上述问题。
        文章下载地址:C语言浮点数
        
               
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,651
精华内容 23,060
关键字:

c语言浮点数

c语言 订阅