![](/img/trans.png)
[英]Floating-point number representation difference between PostgreSQL and Java
[英]Floating point notation representation in java specification
此處: http : //docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3表示:
任何浮點值集的有限非零值都可以用
s · m · 2^(e - N + 1)
的形式表示,其中s
是+1
或-1
,m
是小於2^N
的正整數2^N
和e
是Emin = -(2^(K-1)-2)
和Emax = 2^(K-1)-1
(含Emax = 2^(K-1)-1
之間的整數,其中N
和K
是取決於值集的參數。
下表如下:
Parameter float
N 24
K 8
假設N = 24
, K = 8
那么我們可以從公式中得到以下值: s · 2^N · 2^(2^(K-1)-1 - N + 1)
根據值給出表中指定的值: s * 2^24 * 2^(127 - 24)
等於s * 2^127
。 但是float只有32位,因此不可能在其中存儲這么大的數字。
因此很明顯,應該以不同的方式讀取初始公式。 那么如何? 另外,在Javadoc中也可以獲取Float最大值: http : //docs.oracle.com/javase/7/docs/api/java/lang/Float.html#MAX_VALUE
它說:
持有float
(2-2^-23)·2^127
類型的最大正有限值的常數
這也沒有意義,因為結果值遠大於2 ^ 32-這可能是可以存儲在float變量中的最大值。 再一次,我誤讀了這種表示法。 那么應該如何閱讀呢?
使用浮點表示法的想法是,存儲的數字范圍要比整數表示的相同空間(字節)中存儲的數字范圍大得多。 因此,例如,您說“結果值比2 ^ 32大得多”。 但是,只有當我們在典型的數學類中存儲一個典型的二進制數時,這才是問題。
取而代之的是,浮點表示將這32個字節分成兩個主要部分:-有效位-指數
為簡單起見,假設將3個字節用於有效數並將1個字節用於指數。 還要假設每個都是典型的二進制整數表示形式。 因此,這三個字節的值可以為2 ^ 24,如果要為符號保留一位,則可以為2 ^ 23。 但是,另一個字節最多可以存儲2 ^ 7(如果您也希望在此處存儲符號)。
因此,您可以通過將500存儲在三個字節中並將100存儲在1個字節中來表示500 ^ 100。
本質上,不能精確地存儲每個數字。 一個將其更改為有效形式,並且可以存儲與保留給有效部分的部分一樣多的有效數字(在此示例中為3個字節)。
與其嘗試解釋這些並發症,不如查看Wikipedia文章以獲取更多信息 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.