2017-06-03 17 views
2

私はMySQLを学んでおり、floatの範囲と精度に問題があります。 mannualからMySQLの浮動小数点型の範囲と精度の混乱

FLOATの場合、標準SQLは、括弧内のキーワードFLOAT次のビットに任意の精度の仕様(ただし、指数の範囲)を可能にします。 MySQLはこのオプションの精度仕様もサポートしていますが、精度値はストレージサイズを決定するためにのみ使用されます。精度が0〜23の場合、4バイトの単精度浮動小数点型(single-precision)FLOAT列が生成されます。 24〜53の精度は、8バイトの倍精度DOUBLE列になります。

私は、このコマンド

create table test (f_a float(23)); 

私は4つの混乱を抱えているを使用してテーブルを作成:

  1. mannualでbut not the range of the exponentの意味は何ですか?
  2. insert into test values (1e38);を問題なく実行できます。私が38の数字を入力しても、それはまだ動作します。ただし、39の数字または1e39は失敗します。では、この意味は何ですか?38
  3. f_aのタイプ変換を調べるにはどうすればよいですか? desc test;を実行すると、その列に38桁の数字を挿入した後でも、タイプf_aはまだfloatです。
  4. の範囲の精度はです。
+0

優れた以下の答えが、また良いアドバイスがある*あなたがそうするための具体的な、通知理由がない限り*これらのデータ型を使用していません - これらの型は*近似値を格納し、精度よりも範囲を優先します。 'DECIMAL'を使うのが普通です。浮動小数点数と倍数は必然的に不正確です。お金を計算している場合は、「DECIMAL」データ型が唯一の許容タイプです。 –

+1

@ Michael-sqlbot良い点!多くのtks Mr. Bot:D – spacegoing

答えて

3

IEEE浮動小数点表現はMySQLに固有のものではありません。それはどこでも使われている同じ標準に従います。

1)長さ指定子を無視します。これはちょうどノイズです。単精度(32ビット)及び倍精度(64ビット)、オプションの長さ指定子はちょうどDOUBLEを指定する別の方法を提供していることを

:MySQLでは、浮動小数点データ型は、正確あります。

alter table t add foo FLOAT(4), add bar FLOAT(40) ; 

alter table t add foo FLOAT , add bar DOUBLE ; 

2に相当する)1e38 38は、詳細の全てにダイビングなし

1.0 x 10^38 

と同等だ10の指数電力で浮動本質的には

sign * mantissa * (radix^exponent) 
+1 * 0.12345 * (10^3) 

をそれとも、私たちはBASE2を使用することができ、及び2の時間一部電源(0と1の間)の値を表す:

たとえば、base10で、我々は、このように値123.45を表現できます。

3)1e39(1.0 * 10^39)は、IEEE単精度FLOATで表現できる値の範囲を超えています。 ( "最大表現可能なIEEE 754浮動小数点値は、約3.402x10^38です。^308。

4)範囲最大値と最小値である。DOUBLEの場合、範囲は-1 * 10^308から10^308である。

精度基本的にすることができるの数であります単精度のFLOATについては、約7桁の精度。 DOUBLEの場合は、2桁の15桁の精度の精度が得られます。

-

IEEE浮動小数点は、MySQLに固有のものではありません。ほぼすべての最新のプロセッサは、浮動小数点数で動作する浮動小数点演算ユニットを含む。

参考文献:

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

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

+0

あなたの努力のために多くのtks! – spacegoing

関連する問題