MySQL float 类型范围和精度混淆

spa*_*ing 5 mysql floating-point

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

手册中:

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

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

create table test (f_a float(23));
Run Code Online (Sandbox Code Playgroud)

我有4个困惑:

  1. but not the range of the exponent手册中的是什么意思?
  2. 我可以insert into test values (1e38);毫无问题地执行。即使我输入38数字它仍然有效。但39数字还是1e39会失败。那么这有什么意义呢38
  3. 如何检查 的类型转换f_a?当我执行时,即使我在该列中插入了一个数字,desc test;类型f_a仍然是。float38
  4. 那么,射程精度到底有什么区别呢?

spe*_*593 5

IEEE 浮点表示并不是 MySQL 所独有的。它遵循各地使用的相同标准。

\n\n

1)忽略长度说明符,这只是噪音。在 MySQL 中,只有两种浮点数据类型:单精度(32 位)和双精度(64 位)。

\n\n

该可选长度说明符只是提供了另一种指定方式DOUBLE

\n\n
 alter table t add foo FLOAT(4), add bar FLOAT(40) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于

\n\n
 alter table t add foo FLOAT  , add bar DOUBLE ; \n
Run Code Online (Sandbox Code Playgroud)\n\n

2) 38 1e38 是 10 的指数次方,相当于

\n\n
1.0 x 10^38\n
Run Code Online (Sandbox Code Playgroud)\n\n

在不深入了解所有细节的情况下,浮点数本质上表示为

\n\n
   sign * mantissa  * (radix ^ exponent)\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,在 base10 中,我们可以123.45这样表达该值:

\n\n
    +1  * 0.12345   * ( 10 ^ 3 )\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,我们可以使用 base2,并表示一个值(0 到 1 之间)乘以 2 的某个幂。

\n\n

3) 1e39(1.0*10^39) 大于 IEEE 单精度 FLOAT 可以表示的值范围。(“最大可表示的 IEEE 754 浮点值为 2 * 2^\xe2\x88\x9223 * 2^27,大约为 3.402x10^38。

\n\n

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

\n\n

4)范围是最小值到最大值。对于 DOUBLE,范围是从-1 * 10^30810^308

\n\n

精度基本上是可以表示的位数。对于单精度 FLOAT,我们得到大约 7 位小数位的精度。对于 DOUBLE,我们的精度约为其两倍,即 15 位十进制数字。

\n\n

--

\n\n

IEEE 浮点并不是 MySQL 独有的。几乎所有现代处理器都包含浮点运算单元,对浮点数进行运算。

\n\n

参考:

\n\n

https://en.wikipedia.org/wiki/Single- precision_floating-point_format

\n\n

https://en.wikipedia.org/wiki/Double- precision_floating-point_format

\n