提问者:小点点

MySQL浮点类型范围和精度混淆


我正在学习MySQL,并且对flot的范围和精度有问题。

从手册:

对于FLOAT,SQL标准允许在括号中的关键字FLOAT之后以位为单位的精度(但不是指数范围)的可选规范。MySQL也支持此可选精度规范,但精度值仅用于确定存储大小。从0到23的精度会产生4字节的单精度FLOAT列。从24到53的精度会产生8字节的双精度DOUBLE列。

我使用此命令创建了一个表

create table test (f_a float(23));

我有4个困惑:

  1. 的含义是什么,而不是手册中指数的范围?
  2. 我可以执行插入测试值(1e38);没有问题。即使我输入38数字仍然有效。但是39数字或1e39会失败。那么这个38的含义是什么?
  3. 如何检查f_a的类型转换?当我执行desc test;f_a的类型仍然是浮点数,即使我在该列中插入了38位数字。
  4. 那么,地球上的距离和精度有什么区别?

共1个答案

匿名用户

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^30810^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