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 数值类型用于表示双精度浮点数值. 与整数一样,这些类 ...
随机推荐
- PHP如何查找一列有序数组是否包含某值(二分查找)
问题:对于一列有序数组,如何判断给出的一个值,该值是否存在于数组. 思路:判断是否存在,最简单是,直接循环该数组,对每一个值进行比较.但是对于有序数组来说,这样写就完全没有利用好“有序”这一特点. 所 ...
- FTP大量数据(百万级数据)传输尝试
接上篇<Java FTPClient 大量数据传输的问题(未解决)> 因为数据量过大 FTPClient获取文件列表信息会出现不稳定的问题,找了很多方法都没有解决. 网上找的这一篇文章 h ...
- 关闭Hyper-V后,天翼校园宽带(Netkeeper)依旧显示Sorry, this application cannot run under a Virtual Machin的解决方法
环境: win10专业版,版本1909 经过: 尝试了一下win10 更新后的沙盒系统,当时开启了沙盒,但是未打开Hyper-V,沙盒正常运行. 第二次开机后天翼校园宽带(Netkeeper)显示So ...
- matlab安装matconvnet出错总结
在安装过程中出现两种错误: mex -settup C 出错 mex -setup C 之后, vl_complilenn出错 matconv库需要autoNN和mcnExtraLayers两个库支持 ...
- Activity的生命周期及协同作用
生命周期 onCreate:创建Activity的实例对象的方法 onStart:启动当前的activity实例的方法 onResume:如果该方法执行,页面的实例和用户即可以交互 onPause:如 ...
- Spark Storage 模块
http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ 大神写的太好了,我就不重复造轮子了. Spark ...
- leetcode349 350 Intersection of Two Arrays & II
""" Intersection of Two Arrays Given two arrays, write a function to compute their in ...
- 传入sql语句,执行完提取内容赋值到控件上
class procedure DBTools.FillStrings(ComboBoxEh: TDBComboBoxEh; sql: string; Default: Boolean = False ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Iterator接口
import java.util.List ; import java.util.ArrayList ; import java.util.Iterator ; public class Iterat ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-off
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...