簡體   English   中英

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-1m是小於2^N的正整數2^NeEmin = -(2^(K-1)-2)Emax = 2^(K-1)-1 (含Emax = 2^(K-1)-1之間的整數,其中NK是取決於值集的參數。

下表如下:

Parameter   float   
N              24   
K              8    

假設N = 24K = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM