精华内容
下载资源
问答
  • 最近在处理一个存档文件,用的两个字节来保存浮点数,不能理解,最后找到了这么一种数据类型:半精度浮点数Python原生不支持这样的东西,需要外挂numpy,方可将双字节HEX转为半精度浮点如果是字符串类型的“3c00”...

    最近在处理一个存档文件,用的两个字节来保存浮点数,不能理解,最后找到了这么一种数据类型:半精度浮点数

    Python原生不支持这样的东西,需要外挂numpy,方可将双字节HEX转为半精度浮点

    如果是字符串类型的“3c00”这样的东西,可以用unhexlify,转换成binary类型,然后丢到frombuffer里面用

    from binascii import unhexlify

    import numpy as np

    x=unhexlify(bytes("3c00", 'utf-8'))

    np.frombuffer(x, np.float16)

    结果如下

    3.5763e-06

    嗯。。等等3c00的二进制表示不是?

    0 01111 0000000000

    这个不是应该等于1么?(参见维基百科链接)

    好吧,大约是数据存储的端的问题

    >>> np.frombuffer(b'\x3c\x00', np.float16)

    >>> 3.5763e-06

    >>> np.frombuffer(b'\x00\x3c', np.float16)

    >>> 1

    用buffer的时候注意顺序啊。。。

    展开全文
  • FLOAT类型用于表示近似数值数据类型。...24到53的精度对应DOUBLE列的8字节双精度。单精度浮点数用4字节(32bit)表示浮点数采用IEEE754标准的计算机浮点数,在内部是用二进制表示的如:7.22用32位二进制...

    FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。

    单精度浮点数用4字节(32bit)表示浮点数

    采用IEEE754标准的计算机浮点数,在内部是用二进制表示的

    如:7.22用32位二进制是表示不下的。

    所以就不精确了。

    mysql中float数据类型的问题总结

    对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

    FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。

    MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

    MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准扩展)的同义词,除非SQL服务器模式包括REAL_AS_FLOAT选项。

    为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。

    DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:

    salary DECIMAL(5,2)

    在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。

    在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值。

    标准SQL要求salary列能够用5位整数位和两位小数保存任何值。因此,在这种情况下可以保存在salary列的值的范围是从-999.99到999.99。

    在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC数据类型的变量形式。M默认值是10。

    DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。

    二、mysql 和 oracle中的数值类型

    问题是不是只有 mysql 存在呢?显然不是,只要是符合IEEE754标准的浮点数实现,都存在相同的问题。

    mysql中的数值类型(不包括整型):

    IEEE754浮点数:float(单精度),double或real(双精度)

    定点数:decimal或numeric

    oracle中的数值类型:

    oracle 浮点数 :number(注意不指定精度)

    IEEE754浮点数:BINARY_FLOAT(单精度),BINARY_DOUBLE(双精度)FLOAT,FLOAT(n) (ansi要求的数据类型)

    定点数:number(p,s)

    如果在oracle中,用BINARY_FLOAT等来做测试,结果是一样的。因此,在数据库中,对于涉及货币或其他精度敏感的数据,应使用定点数来存储,对mysql来说是 decimal,对oracle来说就是number(p,s)。双精度浮点数,对于比较大的数据同样存在问题!

    三、编程中也存在浮点数问题

    不光数据库中存在浮点数问题,编程中也同样存在,甚至可以说更值得引起注意!

    通过上面的介绍,浮点数的误差问题应该比较清楚了。如果在程序中做复杂的浮点数运算,误差还会进一步放大。因此,在程序设计中,如果用到浮点数,一定要意识到可能产生的误差问题。不仅如此,浮点数如果处理不好,还会导致程序BUG!看下面的语句:if (x != y) { z = 1 / (x -y);}这个语句看起来没有问题,但如果是浮点数,就可能存在问题!再看下面的语句会输出什么结果: public class Test { public static void main(String[]args) throws Exception { System.out.print("7.22-7.0=" + (7.22f-7.0f)); } } 我们可能会想当然地认为输出结果应该是 0.22 ,实际结果却是 0.21999979 !

    因此,在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题!除了这些,还应注意浮点数中的一些特殊值,如 NaN、+0、-0、+无穷、-无穷等,IEEE754虽然对此做了一些约定,但各具体实现、不同的硬件结构,也会有一些差异,如果不注意也会造成错误!四、总结:

    从上面的分析,我们可以得出以下结论:

    1、浮点数存在误差问题;

    2、对货币等对精度敏感的数据,应该用定点数表示或存储;

    3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;

    4、要注意浮点数中一些特殊值的处理。

    实例

    为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:

    代码如下

    mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));

    Query OK, 0 rows affected (0.29 sec)

    mysql> insert into test values(131072.32,131072.32);

    Query OK, 1 row affected (0.07 sec)

    mysql> select * from test;

    +-----------+-----------+

    | c1| c2|

    +-----------+-----------+

    | 131072.31 | 131072.32 |

    +-----------+-----------+

    1 row in set (0.00 sec)

    从上面的例子中我们看到c1列的值由131072.32变成了131072.31,这就是浮点数的不精确性造成的。

    在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。

    浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;

    它的缺点是会引起精度问题。

    Float类型和double类型的区别

    FLOAT[(M,D)] [ZEROFILL]

    一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有 <24 的一个参数表示一个单精密浮点数字。

    DOUBLE[(M,D)] [ZEROFILL]

    一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。

    本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

    本文系统来源:php中文网

    展开全文
  • 这是因为在现实世界中存在无穷的数据,例如:3.333333333333333333..,数据是无穷的,但是内存是有限的,所以只能存储近似值,float单精度占4个字节,double精度占8个字节,相对来说double精度要高一些。...

    be31fad6c99218c21ee736b337d6a92c.png

    不闲聊!!!不扯淡!!!小UP只分享Java相关的资源干货

    Java浮点类型

    浮点型数据实际上在内存中存储的时候大部分情况下都是存储了数据的近似值,为什么呢?这是因为在现实世界中存在无穷的数据,例如:3.333333333333333333..,数据是无穷的,但是内存是有限的,所以只能存储近似值,float单精度占4个字节,double双精度占8个字节,相对来说double精度要高一些。由于浮点型数据存储的是近似值,所以一般判断两个浮点型数据是否相等的操作很少。

    在java语言中有这样的一条规定:只要是浮点型的字面量,例如1.0、3.14等默认会被当做double类型来处理,如果想让程序将其当做float类型来处理,需要在字面量后面添加f/F。请看以下代码:

    public class DoubleTest {
    	public static void main(String[] args) {
    		float f = 3.0;
    	}
    }

    编译报错了:

    3755afb87dd02c6acede48c05a005718.png

    图4-14:编译错误提示信息

    为什么会编译报错呢?那是因为3.0默认被当做double类型来处理,占用8个字节,前面的f变量是float类型占用4个字节,大容量无法直接赋值给小容量。怎么修改呢?请看代码:

    public class DoubleTest {
    	public static void main(String[] args) {
    		//float f = 3.0;
    		//第一种方案
    		float f = 3.0F;
    		System.out.println("f = " + f);
    		//第二种方案
    		float f1 = (float)3.0;
    		System.out.println("f1 = " + f1);
    	}
    }

    运行结果如下图所示:

    866fbcd29dacdd2f0095ee7756c862db.png

    图4-15:运行结果

    以上程序的第一种方案在3.0后面添加了F,3.0F被当做float类型来处理。第二种方案是进行了强制类型转换,第二种方案可能会存在精度损失。

    学习本文之前建议先看:

    Java十四天零基础入门-Java布尔类型zhuanlan.zhihu.com
    zhihu-card-default.svg

    下一篇文章学习地址:

    Java十四天零基础入门-Java基本数据类型转换zhuanlan.zhihu.com
    zhihu-card-default.svg

    更多相关Java视频教程资料:

    2020最新版Java视频学习路线图-学习Java独孤九剑总纲篇zhuanlan.zhihu.com
    c1bc9980f57cdba6dbad5a2f2f0a8f7e.png

    你的素质五连就是小UP的动力

    4646e27a99cc67957db4266db2e133f2.png
    展开全文
  • 本人自己封装的类库(附带源码,希望高手完善一下封装)。 ... * double: 精度浮点数(小数) 占8个字节 64位二进制 byte[0] byte[1] byte[2] byte[3] byte[4] * byte[5] byte[6] byte[7] */
  • double:精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位) decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位) float f = 345.98756f;//结果显示为345.9876,只...

    float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)

    double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

    decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

     

    float f = 345.98756f;//结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。

    double d=345.975423578631442d;//结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。

    注:float和double的相乘操作,数字溢出不会报错,会有精度的损失。

    decimal dd=345.545454879.....//可以支持28位,对最后一位四舍五入。

    注:当对decimal类型进行操作时,数值会因溢出而报错。

     

    转自:

    haiyang1985

    http://www.cnblogs.com/haiyang1985/archive/2009/03/03/1402394.html

     

    转载于:https://www.cnblogs.com/xingluzhe/p/4754538.html

    展开全文
  • 浮点数转字节组存储

    千次阅读 2013-09-02 21:29:30
    浮点数转字节组存储,主要用于嵌入式等一些特殊情况,比如串口传数据,其主要思路是将浮点数(通常为4字节),每个字节单独传送,到接收端再将它们组合成一个浮点数即可。在C语言中,我们可以采用union方式实现。 ...
  • float和double

    2018-07-06 20:31:34
    float与double类型区别比较2012年07月31日 17:07:59阅读数:55435参考或自http://topic.csdn.net/u/20090716/10/CE4A7037-3C0D-40AE-AF85-F702C78FCEA3.html单精度浮点数在机内占4个字节,用32位二进制描述。...
  • float和double的区别

    千次阅读 2018-07-03 13:41:34
    1.float f=3.4;是否正确? 答:不正确。3.4是双精度数,将精度型(double)赋值给浮点型(float)属于...单精度浮点数(float)与精度浮点数(double)的区别如下:(1)在内存中占有的字节数不同单精度浮点数在...
  • C++基础之float与double

    千次阅读 2011-07-08 14:11:44
    float 是单精度浮点数,在内存中占4个字节,小数点后7位。...有的编译器,所有的float运算内部都是转换成double型的,就算是2个float的运算,也是转换成double,结果再float。有一种说法是,float
  • 自:...单精度就是指4个字节的浮点数,即float双精度就是指8个字节的浮点数,即double decimal是高精度 浮点型 Name CTS Type Description Significant...
  • python中double转化成float32

    万次阅读 2017-08-28 22:45:56
    今天在处理python数据时,发现导入的mat文件类型是double(matlab默认类型就是double)。...首先我们得明白,float(单精度说明符),double(精度说明符) 。单精度型占4个字节(32位)内存空间,其数值范围
  • 在Java中有八大基本数据类型(1)整型int :整数类型short :短整型long :长整型byte :字节类型(2)浮点型float :浮点类型(单精度)double :浮点类型(精度)(3)逻辑型boolean :布尔型(4)字符型char :字符型基本...
  • √ ****double表示这种类型的数值精度是float类型的两倍,又被称作精度,绝大部分应用程序都采用double类型。√ Java 浮点类型常量有两种表示形式√ 十进制数形式,例如:3.14 314.0 0.314√ 科学记数法形式,如314...
  • double 精度浮点数,在机内占8个字节,有效数字16位。 float 和 double都是浮点数,都有取值范围, 都有精度范围。 因此会经常出现下面问题,定义了一个浮点数,经过一系列的计算, 它本来应该等于某个确定值,但...
  • float与double类型区别比较

    千次阅读 2018-01-21 09:44:32
    参考或自...精度浮点数在机内占8个字节,用64位二进制描述。 浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。 数符占1位二进制,表示数的正负。 指数符占
  • 自:http://wenwen.soso.com/z/q104804861.htm ...单精度 float 4字节 精度 double 8字节精度 long double 8字节 换算关系: 1GB=1024MB 1MB=1024KB 1KB=1024Byte 1Byte=8Bit 一个
  • 1. Java基本数据类型转换规则 1.1 Java基本的数据类型 byte 字节型 1字节 ...float 单浮点型 4字节 double 浮点型 8字节 char 字符型 2字节 boolean 布尔型 ...
  • C++数据类型转换

    2020-04-29 18:15:26
    自动转换 若参与运算量的类型不同,则先自动转换成同一类型,然后进行...浮点运算都是以精度进行的(float都要转换成double在进行运算 ) char型和short型参与运算时,必须先转换成int型 赋值运算中,赋值号两边...
  • 这两天在写程序,看了一些文章,过来备忘。原文地址是: ... ...单精度浮点数在机内占4个字节,用32位二进制描述。...精度浮点数在机内占8个字节,用64位二进制描述。 浮点数在机内用指数型式表示,分解为:数符
  • (8种) byte 、short、 int、 long、 char、 float、 double 、boolean 1个字节占8位 整数型byte 1字节 -128~127 、 short 2字节 、int 4字节、long 8字节字符型char 2字节 采用unicode浮点型float 4字节32位 ...
  • 数据类型和类型转换

    2017-07-11 09:18:54
    整数型:byte,short,int,long,char 浮点型:float,double 浮点类型的数据默认是double类型。 转义字符 \n 换行 \b 退格 ...\" 引号 ...char类型的数据使用 单...double 精度 64位 占8字节float是double的一
  • 数据类型转换

    2019-05-17 18:02:34
    1、自动转换 目的类型比原来的类型大。两种类型是相互兼容的 byte->short short->int char->... float->... float 4字节 单精度 double 8字节 精度 两个数中有一个位double类型,另一...
  • 在进行编译时,对float变量分配4个字节,但对于浮点型常量3.14159,则按精度处理,分配8个字节。编译系统会发出“警告”(warning: truncation from const double tofloat)。意为"把一个精度常量转换为...
  • 一 常用的数据类型 数字类型: int类型分类 1 tinyint 1字节 2 smallint 2字节 3 mediumint 3字节 4 int 4字节 5 bigint 8字节 float 浮点数 double 精度 ...
  • C++类型转换规则

    2020-08-10 21:08:03
    自动转换规则: 1、若参与运算量的类型不同,则先转换成...3、所有的浮点运算都是以精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。 4、char型和short型参与运算时,必须先转换

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 206
精华内容 82
关键字:

双字节转float