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个困惑:
but not the range of the exponent手册中的是什么意思?insert into test values (1e38);毫无问题地执行。即使我输入38数字它仍然有效。但39数字还是1e39会失败。那么这有什么意义呢38?f_a?当我执行时,即使我在该列中插入了一个数字,desc test;类型f_a仍然是。float38IEEE 浮点表示并不是 MySQL 所独有的。它遵循各地使用的相同标准。
\n\n1)忽略长度说明符,这只是噪音。在 MySQL 中,只有两种浮点数据类型:单精度(32 位)和双精度(64 位)。
\n\n该可选长度说明符只是提供了另一种指定方式DOUBLE。
alter table t add foo FLOAT(4), add bar FLOAT(40) ;\nRun Code Online (Sandbox Code Playgroud)\n\n相当于
\n\n alter table t add foo FLOAT , add bar DOUBLE ; \nRun Code Online (Sandbox Code Playgroud)\n\n2) 38 1e38 是 10 的指数次方,相当于
1.0 x 10^38\nRun Code Online (Sandbox Code Playgroud)\n\n在不深入了解所有细节的情况下,浮点数本质上表示为
\n\n sign * mantissa * (radix ^ exponent)\nRun Code Online (Sandbox Code Playgroud)\n\n例如,在 base10 中,我们可以123.45这样表达该值:
+1 * 0.12345 * ( 10 ^ 3 )\nRun Code Online (Sandbox Code Playgroud)\n\n或者,我们可以使用 base2,并表示一个值(0 到 1 之间)乘以 2 的某个幂。
\n\n3) 1e39(1.0*10^39) 大于 IEEE 单精度 FLOAT 可以表示的值范围。(“最大可表示的 IEEE 754 浮点值为 2 * 2^\xe2\x88\x9223 * 2^27,大约为 3.402x10^38。
双精度浮点支持更大范围的值,最多 10^308。
\n\n4)范围是最小值到最大值。对于 DOUBLE,范围是从-1 * 10^308 到10^308。
精度基本上是可以表示的位数。对于单精度 FLOAT,我们得到大约 7 位小数位的精度。对于 DOUBLE,我们的精度约为其两倍,即 15 位十进制数字。
\n\n--
\n\nIEEE 浮点并不是 MySQL 独有的。几乎所有现代处理器都包含浮点运算单元,对浮点数进行运算。
\n\n参考:
\n\nhttps://en.wikipedia.org/wiki/Single- precision_floating-point_format
\n\nhttps://en.wikipedia.org/wiki/Double- precision_floating-point_format
\n| 归档时间: |
|
| 查看次数: |
2217 次 |
| 最近记录: |