我正在学习MySQL,并且对flot
的范围和精度有问题。
从手册:
对于FLOAT,SQL标准允许在括号中的关键字FLOAT之后以位为单位的精度(但不是指数范围)的可选规范。MySQL也支持此可选精度规范,但精度值仅用于确定存储大小。从0到23的精度会产生4字节的单精度FLOAT列。从24到53的精度会产生8字节的双精度DOUBLE列。
我使用此命令创建了一个表
create table test (f_a float(23));
我有4个困惑:
的含义是什么,而不是手册中指数
的范围?插入测试值(1e38);
没有问题。即使我输入38
数字仍然有效。但是39
数字或1e39
会失败。那么这个38
的含义是什么?f_a
的类型转换?当我执行desc test;
f_a
的类型仍然是浮点数,即使我在该列中插入了38位数字。
IEEE浮点表示并不是MySQL独有的。它遵循到处使用的相同标准。
1)忽略长度说明符,那只是噪音。在MySQL中,正好有两种浮点数据类型:单精度(32位)和双精度(64位)。
这个可选的长度说明符只是提供了一种指定DOUBLE
的替代方法。
alter table t add foo FLOAT(4), add bar FLOAT(40) ;
相当于
alter table t add foo FLOAT , add bar DOUBLE ;
2)1e38
中的38是10的指数幂。这相当于
1.0 x 10^38
在不深入研究所有细节的情况下,浮点数本质上表示为
sign * mantissa * (radix ^ exponent)
例如,在base10中,我们可以这样表达值123.45
:
+1 * 0.12345 * ( 10 ^ 3 )
或者,我们可以使用base2,并表示一个值(介于0和1之间)乘以2的幂。
3)1e39
(1.0*10^39)大于可以用IEEE单精度FLOAT表示的值范围。(“最大可表示IEEE754浮点值为2*2^−23*2^27,约为3.402x10^38。
DOUBLE精度浮点支持更大范围的值,最高可达10^308。
4)range是最小值到最大值。对于DOUBLE,范围是从-1*10^308
到10^308
。
精度基本上是可以表示的位数。对于单个精度FLOAT,我们得到大约7个十进制数字的精度。对于DOUBLE,我们的精度在两倍左右,即15个十进制数字。
--
浮点IEEE并不是MySQL独有的。几乎所有现代处理器都包含浮点运算单元,对浮点数进行运算。
参考资料:
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format