4.2用C语言表示:double d = 4.2。C语言中用于描述小数的数据类型是float和double,float类型表示单精度浮点数,double表示双精度浮点数。
1、float:
FLOAT 数据类型用于存储单精度浮点数或双精度浮点数。浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 excess-127 二进制指数和一个 23 位尾数。
2、double:
double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字。
扩展资料
(1) 浮点型与整型
将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。
(2) 单、双精度浮点型
由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。
参考资料:百度百科-C语言类型强制转换
中国自古以来就使用十进位制计数法,一些实用的计量单位也采用十进制,所以很容易产生十进分数,即小数的概念。
第一个将这一概念用文字表达出来的是魏晋时代的刘徽。他在计算圆周率的过程中,用到尺、寸、分、厘、毫、秒 、忽等7个单位;对于忽以下的更小单位则不再命名,而统称为“微数”。
到了宋、元时代,小数概念得到了进一步的普及和更明确的表示。杨辉《日用算法》(1262年)载有两斤换算 的口诀:“一求,隔位六二五;二求,退位一二五”,即1/16=0?0625;2/16=0?125。
这里的“隔位”、“退位”已含有指示小数点位置的意义。秦九韶则将单位注在表示整数部分个位的筹码之下,例如: —Ⅲ—Ⅱ表示13.12寸 寸是世界上最早的小数表示法。
在欧洲和伊斯兰国家,古巴比伦的六十进制长期以来居于统治地位,一些经典科学著作都是采用六十进制,因此十进制小数的概念迟迟没有发展起来。15世纪中亚地区的阿尔卡西(?~1429)是中国以外第一个应用小数的人。
欧洲数学家直到16世纪才开始考虑小数,其中较突出的是荷兰人斯蒂文(1548~1620),他在《论十进制》(1583年)一书中明确表示法。例如把5.714记为:5◎7①1②4③或5,7'1''4'''。
而第一个把小数表示成今日世界通用的形式的人是德国数学家克拉维斯(1537~1612),他在《星盘》(1593年)一书中开始使用小数点作为整数部分与小数部分之间的分界符。 而中国比欧洲早采用了小数三百多年。
由于“编码总位数为8”的限制,真值-128无法用原码、反码来表示,似乎不能用上述规则来求解补码,但实际上是可行的——只要不管它的最高位即可,操作办法如下:
将128化为二进制为:1 0000000,最高位为1,可以只对舍去最高位后剩余的7位进行处理即可,首先取反得:1111111,加1得:1 0000000,最高位有进位需丢弃,即得:0000000,加上符号位就得补码:1 0000000。
又如,当编码总位数为4时,真值X=+0.101的原码、反码、补码均为:0 101。
真值X=-0.101的原码、反码、补码依次为:1 101、1 010、1 011。
同理,特例,-1的补码为:1 000。
在定点小数中,小数点隐含在第一位编码和第二位编码之间
定点小数,是指小数点准确固定在数据某个位置上的小数,从实用角度看,都把小数点固定在最高数据位的左边,小数点前边再设一位符号位。按此规则,任何一个小数都可以被写成 :
N = NS . N-1 N-2 … N-M
如果在计算机中用m+1个二进制位表示上述小数,则可以用最高(最左)一个二进制位表示符号(如用0表示正号,则1就表示负号),而用后面的m个二进制位表示该小数的数值。小数点不用明确表示出来,因为它总是固定在符号位与最高数值位之间,已成定论。定点小数的取值范围很小,对用m+1个二进制位的小数来说,其值的范围为:
|N| ≤ 1-2^(-m) 即小于1的纯小数,这对用户算题是十分不方便的,因为在算题前,必须把要用的数,通过合适的 比例因子化成绝对值小于1的小数,并保证运算的中间和最终结果的绝对值也都小于1,在输出真正结果时,还要把计算的结果按相应比例加以扩大。
定点小数表示法,主要用在早期的计算机中,它最节省硬件。随着计算机硬件成本的大幅度降低,现代的通用计算机都被设计成能处理与计算多种类型数值的计算机。我们将主要通过定点小数讨论数值数据的不同编码方案,而且,定点小数也被用来表示浮点数的尾数部分。
如果是简单的小数,假如用于表示钱数的,小数位两位
那么就可以把所有数字都乘100,然后都变成整数,然后最后输出的时候,你记得里面是有两位小数就行了,直接表示出来。
如果是专业的小数计算,那就要用到数字的浮点表示法,
原理是在几个字节的表示中,有的二进制用来表示数据的有效位,有的二进制位用来表示这个数字的小数的位数,有的用来表示符号。
有点类似科学计数法,所有的数字都是0.abcEXY 比如0.25E3=250
二进制的表示都是0.1XXX,所以,前面的1都省略,
你可以查一下计算机原理,有详细的浮点数表示法
在汇编里,也有浮点数运算语句
Java 语言支持两种基本的浮点类型: float 和 double ,以及与它们对应的包装类 Float 和 Double 。
它们都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。 IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。
IEEE 浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。
小数部分用二进制(底数 2)小数来表示,这意味着最高位对应着值 ?(2 -1),第二位对应着 ?(2 -2),依此类推。对于双精度浮点数,用 11 位表示指数,52 位表示尾数。
IEEE 浮点值的格式如图 1 所示。 图 1. IEEE 754 浮点数的格式 因为用科学记数法可以有多种方式来表示给定数字,所以要规范化浮点数,以便用底数为 2 并且小数点左边为 1 的小数来表示,按照需要调节指数就可以得到所需的数字。
所以,例如,数 1.25 可以表示为尾数为 1.01,指数为 0: (-1) 0*1.01 2*2 0 数 10.0 可以表示为尾数为 1.01,指数为 3: (-1) 0*1.01 2*2 3 特殊数字 除了编码所允许的值的标准范围(对于 float ,从 1.4e-45 到 3.4028235e+38),还有一些表示无穷大、负无穷大、-0 和 NaN(它代表“不是一个数字”)的特殊值。这些值的存在是为了在出现错误条件(譬如算术溢出,给负数开平方根,除以 0 等)下,可以用浮点值集合中的数字来表示所产生的结果。
这些特殊的数字有一些不寻常的特征。例如, 0 和 -0 是不同值,但在比较它们是否相等时,被认为是相等的。
用一个非零数去除以无穷大的数,结果等于 0 。特殊数字 NaN 是无序的;使用 == 、 运算符将 NaN 与其它浮点值比较时,结果为 false 。
如果 f 为 NaN,则即使 (f == f) 也会得到 false 。如果想将浮点值与 NaN 进行比较,则使用 Float.isNaN() 方法。
表 1 显示了无穷大和 NaN 的一些属性。 表 1. 特殊浮点值的属性 表达式 结果 Math.sqrt(-1.0) -> NaN 0.0 / 0.0 -> NaN 1.0 / 0.0 -> 无穷大 -1.0 / 0.0 -> 负无穷大 NaN + 1.0 -> NaN 无穷大 + 1.0 -> 无穷大 无穷大 + 无穷大 -> 无穷大 NaN > 1.0 -> false NaN == 1.0 -> false NaN false NaN == NaN -> false 0.0 == -0.01 -> true 基本浮点类型和包装类浮点有不同的比较行为 使事情更糟的是,在基本 float 类型和包装类 Float 之间,用于比较 NaN 和 -0 的规则是不同的。
对于 float 值,比较两个 NaN 值是否相等将会得到 false ,而使用 Float.equals() 来比较两个 NaN Float 对象会得到 true 。造成这种现象的原因是,如果不这样的话,就不可能将 NaN Float 对象用作 HashMap 中的键。
类似的,虽然 0 和 -0 在表示为浮点值时,被认为是相等的,但使用 Float.compareTo() 来比较作为 Float 对象的 0 和 -0 时,会显示 -0 小于 0 。 浮点中的危险 由于无穷大、NaN 和 0 的特殊行为,当应用浮点数时,可能看似无害的转换和优化实际上是不正确的。
例如,虽然好象 0.0-f 很明显等于 -f ,但当 f 为 0 时,这是不正确的。还有其它类似的 gotcha,表 2 显示了其中一些 gotcha。
表 2. 无效的浮点假定 这个表达式…… 不一定等于…… 当…… 0.0 - f -f f 为 0 f = g) f 或 g 为 NaN f == f true f 为 NaN f + g - g f g 为无穷大或 NaN 舍入误差 浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。
因此,浮点运算可能导致舍入误差,产生的结果接近 ― 但不等于 ― 您可能希望的结果。例如,下面这个简单的计算将得到 2.600000000000001 ,而不是 2.6 : double s=0; for (int i=0; i<26; i++) s += 0.1; System.out.println(s); 类似的, .1*26 相乘所产生的结果不等于 .1 自身加 26 次所得到的结果。
当将浮点数强制转换成整数时,产生的舍入误差甚至更严重,因为强制转换成整数类型会舍弃非整数部分,甚至对于那些“看上去似乎”应该得到整数值的计算,也存在此类问题。例如,下面这些语句: double d = 29.0 * 0.01; System.out.println(d); System.out.println((int) (d * 100)); 将得到以下输出:0.29 28 这可能不是您起初所期望的。
浮点数比较指南 由于存在 NaN 的不寻常比较行为和在几乎所有浮点计算中都不可避免地会出现舍入误差,解释浮点值的比较运算符的结果比较麻烦。最好完全避免使用浮点数比较。
当然,这并不总是可能的,但您应该意识到要限制浮点数比较。如果必须比较浮点数来看它们是否相等,则应该将它们差的绝对值同一些预先选定的小正数进行比较,这样您所做的就是测试它们是否“足够接近”。
(如果不知道基本的计算范围,可以使用测试“abs(a/b - 1) < epsilon”,这种方法比简单地比较两者之差要更准确)。甚至测试看一个值是比零大还是比零小也存在危险 ―“以为”会生成比零略大值的计算事实上可能由于积累的舍入误差会生成略微比零小的数字。
NaN 的无序性质使得在比较浮点数时更容易发生错误。当比较浮点数时,围绕无穷大和 NaN 问题,一种避免 gotcha 的经验法则是显式地测试值的有效性,而不是试图排除无效值。
在清单 1 中,有两个可能的用于特性的 setter 的实现,该。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.178秒