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慢。

原文地址:https://www.cnblogs.com/Cobby-baby/p/12249405.html

时间: 2024-08-14 23:41:26

C语言-浮点类型的相关文章

网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型

C语言程序设计进阶_第一周:数据类型:整数类型.浮点类型.枚举类型 1.0数据类型 1.1整数类型 1.2浮点类型 1.3逻辑类型 1.4类型转换和条件运算 1.0数据类型 1 整数 char(%c), short, int(%d), long(%ld), long long(C99) 2 浮点数 float(%f), double(%lf), long double(C99) 3 逻辑 bool(C99) 4 指针 5 自定义类型 所表达的数的范围:char<short<int<flo

C语言的数据类型——整数类型和浮点类型

??基本数据类型分为整数类型和浮点类型两大类.其中,整数类型又可以被细分成有符号整型与无符号整型. 1.整数类型 有符号整型 short int int long int long long int char(使用整数存储字符) 无符号整型 unsigned short int unsigned int unsigned long int unsigned long long int unsigned char(使用整数存储字符) ??其中,后面的类型不能小于前面的类型,即short int占用

Go语言之类型

Go语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么. 提前知道值的类型的好处有很多,比如编译器可以合理地使用这些值,可以进一步优化代码,提高执行的效率,减少bug等. 基本类型 基本类型是Go语言自带的类型,比如数值类型.浮点类型.字符类型以及布尔类型.它们本质上是原始类型,也就是不可改变的,所以对它们进行操作,一般都会返回一个新创建的值.所以把这些值传递给函数时,其实传递的是一个值的副本.

MySQL数据类型--------浮点类型实战

1. 背景 * MySQL支持的浮点类型中有单精度类型(float), 双精度类型(double),和高精度类型(decimal),在数字货币类型中推荐使用高精度类型(decimal)来进行应用. * MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001.FLOAT和DOUBLE在不指

学习Golang语言(6):类型--切片

学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 学习Golang语言(6):类型--切片 在很多应用场景中,数组不能够满足我们的需求.在初始定义数组时,我们并不知道数组所需的长度.因此,我们需要一个大小可以动态变化的数组(动态数组) 在Go语言中,这种"动态数组"成为slice(切片). 但是实际上slic

Swift 语言附注 类型

本页包含内容: 类型注解(Type Annotation) 类型标识符(Type Identifier) 元组类型(Tuple Type) 函数类型(Function Type) 数组类型(Array Type) 可选类型(Optional Type) 隐式解析可选类型(Implicitly Unwrapped Optional Type) 协议合成类型(Protocol Composition Type) 元类型(Metatype Type) 类型继承子句(Type Inheritance C

使用浮点类型导致计算误差以及判断误差

1.计算误差 浮点的精度是可变的,除非分数是2的整数幂次方,否者无法用有限的二进制小数表示. 即 0.1 分母为10, 则分数应该是2的3次方至2的4次方之间,具体是多少我也算不出来了···.即这个次方数会为一个特别长的小数,在有限的长度中无法体现出来. 则0.1会被表示为一个十分接近0.1的值,如0.1000000000000000001 或0.099999999999999999 所以在精确的计算中,使用浮点类型会造成计算的误差. 使用decimal可以解决此问题,不过decimal的范围比

使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理

使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围. <climits>该头文件包含了系统的整数长度的限制,它已取代了头文件<limits.h> <cfloat> 该头文件包含了系统的浮点数的长度限制,它以取代了头文件<float.h> <cfloat> 头文件各字符常量的取值和含义 上图中在程序中

Java浮点类型的格式化

概述 基于Java,介绍将浮点类型小数进行格式化的方案. 正文 在Java中,用于格式化小数的类是java.text.DecimalFormat,比如你可以这样使用: double data = 3334590479.22d; System.out.println(data); // 3.33459047922E9 java.text.DecimalFormat df = new java.text.DecimalFormat("$#,###.##"); String result =