学习C语言笔记:浮点类型float、double和long double

浮点类型能表示包括小数在内更大范围的数。浮点数的表示类似于科学计数法(即用小数乘以10的幂来表示数字)。该记数系统常用于表示非常大或非常小的数。 

float

C语言规定,float类型必须至少能表示6位有效数字,且取值范围至少是10^{-37}~10^{+37}。前一项规定指float类型必须能够表示33.333333的前6位数字,而不是精确到小数点后6位数字。后一项规定用于方便地表示诸如太阳质量(2.0e30千克)、一个质子的电荷量(1.6e-19库仑)或国家债务之类的数字。通常,系统存储一个浮点数要占用32位。其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号。

double

C语言提供的另一种浮点类型是double(意为双精度)。double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。一般情况下,double占用64位而不是32位。一些系统将多出的32位全都用来非指数部分,这不仅增加了有效数字的位数(即提高了精度),而且还减少了舍入误差。另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表示的范围。无论哪种方法,double类型的值至少有13位有效数字,超过了标准的最低位规定。

long double

C语言的第3种浮点类型是long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。

浮点型常量

浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的指数。例如:

-1.56E+12

2.76e-3

正号可以省略。可以没有小数点(如,2E5)或指数部分(如,19.28),但是不能同时省略两者。可以省略小数部分(如,3.E16)或整数部分(如,.45E-6),但是不能同时省略两者。

例如:

3.14159

-2

4e16

.8E-5

100.

不要在浮点型常量中间加空格:1.56 E+12(错误!)

默认情况下,编译器假定浮点型常量是doble类型的精度。例如,假设some是float类型的变量,编写下面的语句:

some = 4.0 * 2.0;

通常,4.0和2.0被存储为64位的double类型,使用双精度进行乘法运算,然后将乘积截断成float类型的宽度。这样做虽然计算精度更高,但是会减慢程序的运行速度。

在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f和9.1E9F。使用l后L后缀使得数字成为long double类型,如54.32和4.32L.注意,最好使用L后缀,因为字母l与数字1容易混淆。没有后缀的浮点型常量是double类型。

浮点值的上溢和下溢

假设系统的最大float类型值是3.4E38,编写如下代码:

float toobig = 3.4E38 * 100.0f;

printf("%e\n", toobig);

会发生什么呢?这是一个上溢的示例。当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。这种行为在过去是未定义的,不过现在C语言规定,在这种情况下会给toobig赋一个表示无穷大的特定值,而且printf()显示该值为inf 或 infinity(或者具有无穷含义的其他内容)。

当对一个很小的数做除法时,情况更为复杂。回忆一下,float类型的数是以指数和尾数部分来存储。存在这样一个数,它的指数部分是最小值,即由全部可用位表示的最小尾数值。该数字是float类型能用全部精度表示的最小数字。现在把它除以2.通常,这个操作会减小指数部分,但是假设的情况中,指数已经是最小值了。所以计算机只好把尾数部分的位向右移,空出第1个二进制位,并丢弃最后一个二进制数。以十进制为例,把一个有4位有效数字的数(如,0.1234E-10)除以10,得到的结果是0.0123E-10.虽然得到了结果,但是在计算过程中却损失了原末尾有效位上的数字。这种情况叫作下溢。C语言把损失了类型全精度的浮点值称为低于正常的浮点值。因此,把最小的正浮点数除以2将得到一个低于正常的值。如果除以一个非常大的值,会导致所有的位都为0.现在c库已经提供了用于检查计算是否会产生低于正常值的函数。

还有另一个特殊的浮点值NaN。例如,给asin()函数传递一个值,该函数将返回一个角度,该角度的正弦就是传入函数的值。但是正弦值不能大于1,因此,如果传入的参数大于1,该函数的行为是未定义的。在这种情况下,该函数将返回NaN值,printf()函数可将其显示为nan、NaN或其他类似的内容。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
long long double是C++语言中的一种数据类型,它是一种长双精度点数类型。根据引用,long double在内存中占用12个字节,即96位。它的数值范围非常广,从1.18973e4932到3.3621e-4932。与其他点数类型相比,long double提供了更高的精度和更大的数值范围。 另一方面,根据引用,在点数类型中使用double类型基本上不会出错。相对于float类型double类型的精度损失较小,且在某些机器上计算速度更快。float类型只能保证6位有效数字,而double类型至少可以保证15位有效数字。因此,在大多数情况下,使用double类型已经足够满足需求,而long double类型的精度通常不必要且会带来额外的运行代价。 最后,引用提到了有关整数类型long和int的区别,而long long double是一个点数类型,与整数类型无直接关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C/C++中各种类型int、longdouble、char表示范围(最大最小值)](https://blog.csdn.net/weixin_34128411/article/details/86110079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [int, long long, double 等数据类型的长度及范围整理](https://blog.csdn.net/Dejan520/article/details/124837715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨小古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值