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

时间:2017-06-03 02:29:36

标签: mysql floating-point

我正在学习MySQL并且float的范围和精度都有问题。

来自mannual

  

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

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

create table test (f_a float(23));

我有4次混淆:

  1. but not the range of the exponent在mannual中的含义是什么?
  2. 我可以毫无问题地执行insert into test values (1e38);。即使我输入38数字,它仍然有效。但39数字或1e39将失败。那么这个38是什么意思?
  3. 如何检查f_a的类型转换?当我执行desc test;时,即使我在该列中插入f_a位数后,float的类型仍为38
  4. 那么,范围精确度之间有什么区别?

1 个答案:

答案 0 :(得分:4)

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表示的值的范围。 (“最大可表示的IEEE 754浮点值为2 * 2 ^ -23 * 2 ^ 27,约为3.402x10 ^ 38。

DOUBLE精度浮点支持更大范围的值,最多10 ^ 308。

4)范围是最大值的最小值。对于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