C语言-浮点类型
C语言-浮点类型
浮点类型

在0的两侧有一小块区域,这个区域非常接近0,但是不等于0,是float(表达范围数量级10-38)或者double(达范围数量级10-308)无法表达的,而0是可以表达的;nan:不是一个有效的数字。有效数字:在有效数字范围是精确的,超出这个范围是不准确的。

%e:输出科学计数法的形式,%E只是表示时字母大写。
在使用科学计数法时,数字与E或者e之间不要有任何空格。小数点位数较多时,double有时显示不出来小数位的数字如1E-10,以double输出时只是0.000000,想要看到1,在printf可以指定输出的位数,如使用%.16f。所以可以在%和f之间加上.n可以指定输出小数点后几位,这样的输出时做四舍六入五成双的规则。
printf("%.3f\n",-0.0049) 结果保留3位 -> 0.005
printf("%.30f\n",-0.0049) 结果保留30位 -> 0.004899999999...
printf("%.3f\n",-0.00049) 结果保留3位 -> 0.000
printf("%.3f\n",-0.0045) 结果保留3位 -> 0.0004
第二种实际上是计算机内部真实的情况,-0.0049实际不能被计算机精确的表达为-0.0049。
虽然理论上来说数是连续的,也就是说,任意取两个点,你可以在两个点之间获得任意多的数,数量是无限的(实数的稠密性),但对计算机来说,只能用离散的数字来表达数字,位于两个紧邻的数字之前的数字是数据类型如double,不能表达的。当你写出0.0049的时候,而这个数恰好是所能表达的两个数之间的数字,我们就必须选择离它最近的那个数字来表达它,但它和实际的0.0049是有段距离的,而这个距离就是浮点数误差。
第四种里的0.0045其实是0.00449... ,是个很接近0.0045的数字
浮点数的范围与精度
超过范围的浮点数
printf输出inf表示超过范围的浮点数:+- ∞
printf输出nan表示不存在的浮点数
浮点正数除以0结果是正inf;浮点负数除以0结果为-inf,浮点0除以0是nan。
但需注意:整数除以0,结果报错。因为无穷大无法用整数来表达,但无穷大可以用浮点数来表达,虽然浮点有效范围内部包含无穷大,但是在浮点数的设计里,把无穷大,nan定义在浮点数里面。同时注意浮点的运算是没有精度的。做个简单的实验:
#include <stdio.h>
int main()
{
float a,b,c;
a = 1.345f;
//f表示一个float型浮点数,不带的话,C默认浮点数类型是double类型
b = 1.123f;
c = a + b;
if (c == 2.468)
printf("相等\n");
else
printf("不相等!c=%.10f,或%f\n",c,c);
return 0;
}
//结果:不相等!c=2.4679999352(实际只有7位有效2.467999),或2.468000
这里虽然前面声明了float类型,但是在下面表示float也要加上f,否则报错
- 带小数点的字面量是double而非float
- float需要用f或F后缀来表明身份
- 两个float直接用==来判断可能失败
- fabs(f1-f2) < 1e-8或1e-12(7个有效数字就可以)来判断是否相等。所以不要用浮点数来做一些精确的运算。特别是金钱的运算,例如1.23元和1.34元相加减等,这些误差会累积,解决的简单方法是换算成整数再运算,整数永远都是精确的,所以可以把1.23元换成123分。浮点数只能在一定的范围内相信它。
浮点数的内部表达
整数是纯二进制来表达的,所以两个浮点数可以直接做运算,而浮点数则不同,其背部是一种编码的形式。

一个bit来表达正负数,11个bit来表达指数部分是多少,后面用来表达分数部分是多少,但这里未必把所有的bit都用完。
浮点数在计算时是由专用的硬件部分(协处理器,现在基本都集成到CPU中了)来实现的,计算时将编码交给专门的硬件,硬件会把其解开来,然后来计算,计算后再编码成这样的数字给你。计算double和float所用的部件是一样的。
选择浮点类型
- 如果没有特殊需要,只使用double
- 现代CPU能直接对double做硬件运算,性能不会比float差,在64位的机器上,数据存储的速度也不比float慢。
C语言-浮点类型的更多相关文章
- 生成跨语言的类型声明和接口绑定的工具(Djinni )
Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...
- 使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理
使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围 ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- java浮点类型计算
java浮点类型需要采用java.math.*这个工具包,这样的计算结果才是我们想要的.呵呵 import java.math.BigDecimal; import java.text.NumberF ...
- 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i- ...
- c语言的类型、运算符与表达式
title: 2017-10-17c语言的类型.运算符与表达式 tags: c程序设计语言 grammar_cjkRuby: true --- 1.1 数据类型 char 字符型,一个字节 int 整 ...
- java 基础 浮点类型
1.浮点类型用于表示小数的数据类型. 2.浮点数原理:也就是二进制科学计数法. 3.Java的浮点类型有float和double两种. 4.Java默认浮点类型计算的结果是double类型,字面量也是 ...
- 3. Go语言基本类型
Go语言基本类型如下: bool string 数值类型 (int8, int16, int32, int64, int, uint8, uint16, uint32, uint64, uint, f ...
- MySQL 的三个浮点类型
MySQL 支持的三个浮点类型是 FLOAT.DOUBLE 和 DECIMAL 类型. FLOAT 数值类型用于表示单精度浮点数值, DOUBLE 数值类型用于表示双精度浮点数值. 与整数一样,这些类 ...
随机推荐
- Deepctr框架代码阅读
DeepCtr是一个简易的CTR模型框架,集成了深度学习流行的所有模型,适合学推荐系统模型的人参考. 我在参加比赛中用到了这个框架,但是效果一般,为了搞清楚原因从算法和框架两方面入手.在读代码的过程中 ...
- jmeter用Stepping Thread Group 递增并发数
jmeter安装插件Stepping Thread Group 如图所示设置的时候,本以为是每2秒 按 1 2 3 4 递增的,总共请求应该是10个,可是运行后却请求了几十个. 这个是有关线程数是否就 ...
- linux(centos6.9)下使用yum安装mysql,及启动MySQL等
查看系统自带的mysql版本:rpm -qa | grep mysql 卸载mysql:rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps 1. 安装my ...
- id 和 class的区别
id 选择器 ID 只能被指定单个元素使用,无法多个元素使用.像你的身份证号,是唯一的,id 选择器以 “#” 来定义.id选择器的优先级高于class选择器的优先级的 # userid { text ...
- Python最新暴力破解WiFi,攻破所有密码限制,最强破解!
暴力破解wifi密码 这个代码也是非常简单,这里需要用Python中的pywifi这个库,所以需要在DOS命令下安装这个库,同样使用pip install pywifi,很简单就安装成功了,我用的是P ...
- 052、Java中使用do…while循环实现1~100的累加
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- centos7下安装ansible
由于centos7预装了python,因此我们可以跳过python的安装环节(记得关闭防火墙) [root@model ~]# [root@model ~]# python --version Pyt ...
- setTimeout的异步
http://www.cnblogs.com/littledu/articles/2607211.html http://www.cnblogs.com/rubylouvre/archive/2009 ...
- POJ1703 && POJ2942 &&POJ 1182 并查集 这个做法挺巧妙
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37242 Accepted: ...
- 禁用u盘再启用
将u盘量产为CDROM后,刷入ISO后需要重新插拔u盘才能访问新内容.此文展示的代码可以实现模拟这种行为,免插拔使windows重新读取cdrom. 网上参考资料有限,自行试验了很多种方法,终于成功了 ...