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

问题描述 投票:3回答:1

我正在学习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在手册中的含义是什么?
  2. 我可以毫无问题地执行insert into test values (1e38);。即使我键入38数字它仍然有效。但39数字或1e39将失败。那么38的含义是什么?
  3. 我怎样才能检查f_a的类型转换?当我执行desc test;时,即使我将f_a数字插入该列,float的类型仍然是38
  4. 那么,地球上的射程和精度之间有什么区别?
mysql floating-point
1个回答
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)

例如,在基数10中,我们可以用这种方式表示值qazxsw poi:

123.45

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

3) +1 * 0.12345 * ( 10 ^ 3 ) (1.0 * 10 ^ 39)大于可以用IEEE单精度FLOAT表示的值的范围。 (“最大可表示的IEEE 754浮点值为2 * 2 ^ -23 * 2 ^ 27,约为3.402x10 ^ 38。

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

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

precision基本上是可以表示的位数。对于单精度FLOAT,我们得到大约7个十进制数字的精度。对于DOUBLE,我们的精度在两倍左右,15位十进制数。

--

IEEE浮点并非MySQL独有。几乎所有现代处理器都包括浮点运算单元,它们以浮点数运算。

参考文献:

10^308

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

© www.soinside.com 2019 - 2024. All rights reserved.