Java虛擬機(jī)中基本數(shù)據(jù)類型實(shí)踐
- 參考一Java的基本數(shù)據(jù)類型在虛擬機(jī)中的實(shí)現(xiàn)
- 參考二深入了解Java虛擬機(jī)-Java基本類型
-
基本數(shù)據(jù)類型的大小
-
float 和 double 除以 0.0 不會(huì)崩潰 -> 遇見問題 0 / 0.0 或者 100 / 0.0 沒有拋出異常
在寫代碼的的時(shí)候 1. 任意整數(shù)(byte度气、short、int孝宗、long皆可)除以整數(shù)0結(jié)果為ArithmeticException是整; eg: 1 / 0 會(huì)拋出異常 2. 任意數(shù)除以浮點(diǎn)0.0結(jié)果,沒有拋出異常作喘,查看源碼時(shí)發(fā)現(xiàn) eg: 0 / 0.0 返回是 NaN eg: 100 / 0.0 返回 Infinity
-
解釋
- Java 的浮點(diǎn)類型采用 IEEE 754 浮點(diǎn)數(shù)格式惧笛。以 float 為例仲翎,浮點(diǎn)類型通常有兩個(gè) 0壶辜,+0.0F 以及 -0.0F悯舟。
- 前者在 Java 里是 0,后者是符號(hào)位為 1砸民、其他位均為 0 的浮點(diǎn)數(shù)抵怎,在內(nèi)存中等同于十六進(jìn)制整數(shù) 0x8000000(即 -0.0F 可通過 Float.intBitsToFloat(0x8000000) 求得)。盡管它們的內(nèi)存數(shù)值不同岭参,但是在 Java 中 +0.0F == -0.0F 會(huì)返回真反惕。
- 在有了 +0.0F 和 -0.0F 這兩個(gè)定義后,我們便可以定義浮點(diǎn)數(shù)中的正無窮及負(fù)無窮演侯。正無窮就是任意正浮點(diǎn)數(shù)(不包括 +0.0F)除以 +0.0F 得到的值姿染,而負(fù)無窮是任意正浮點(diǎn)數(shù)除以 -0.0F 得到的值。在 Java 中秒际,正無窮和負(fù)無窮是有確切的值悬赏,在內(nèi)存中分別等同于十六進(jìn)制整數(shù) 0x7F800000 和 0xFF800000狡汉。
- 你也許會(huì)好奇,既然整數(shù) 0x7F800000 等同于正無窮闽颇,那么 0x7F800001 又對(duì)應(yīng)什么浮點(diǎn)數(shù)呢盾戴?這個(gè)數(shù)字對(duì)應(yīng)的浮點(diǎn)數(shù)是 NaN(Not-a-Number)。
- 不僅如此兵多,[0x7F800001, 0x7FFFFFFF]和[0xFF800001, 0xFFFFFFFF]對(duì)應(yīng)的都是 NaN尖啡。當(dāng)然,一般我們計(jì)算得出的 NaN剩膘,比如說通過 +0.0F/+0.0F可婶,在內(nèi)存中應(yīng)為 0x7FC00000。這個(gè)數(shù)值援雇,我們稱之為標(biāo)準(zhǔn)的 NaN矛渴,而其他的我們稱之為不標(biāo)準(zhǔn)的 NaN。
- NaN 有一個(gè)有趣的特性:除了“!=”始終返回 true 之外惫搏,所有其他比較結(jié)果都會(huì)返回 false具温。
舉例來說, “NaN<1.0F”返回 false筐赔, 而“NaN>=1.0F”同樣返回 false铣猩。 對(duì)于任意浮點(diǎn)數(shù) f,不管它是 0 還是 NaN茴丰, 1. “f!=NaN”始終會(huì)返回 true达皿, 2. 而“f==NaN”始終會(huì)返回 false
- 因此,我們?cè)诔绦蚶镒龈↑c(diǎn)數(shù)比較的時(shí)候贿肩,需要考慮上述特性
案例
/**
* Java 數(shù)據(jù)/0 的一些分析
* 1. 任意整數(shù)(byte峦椰、short、int汰规、long皆可)除以整數(shù)0結(jié)果為ArithmeticException汤功;
* 2. 0除以浮點(diǎn)0結(jié)果為NAN,細(xì)分的話包括以下三種情況:
* **** 1. 0/0.0
* **** 2. 0.0/0.0
* **** 3. 0.0/0 雖然除的是個(gè)整數(shù)0溜哮,但在運(yùn)算過程中發(fā)生了類型轉(zhuǎn)化變成了浮點(diǎn)0
* 3. 任意數(shù)除以浮點(diǎn)0結(jié)果為Infinity/-Infinity滔金。
* 4. java中浮點(diǎn)數(shù)0并非一個(gè)準(zhǔn)確值,而是一個(gè)無限接近0的數(shù)
* 5. Java float 和 double 類型茂嗓,
* 1. 就像其他任何語言(以及幾乎任何硬件FP單元)一樣餐茵,實(shí)現(xiàn)了浮點(diǎn)數(shù)學(xué)的IEEE 754標(biāo)準(zhǔn),它要求除以零以返回特殊的“無窮大”值述吸。拋出異常實(shí)際上會(huì)違反該標(biāo)準(zhǔn)忿族。
* 2. 整數(shù)算術(shù)(由Java和大多數(shù)其他語言和硬件實(shí)現(xiàn)為二進(jìn)制補(bǔ)碼表示)是不同的,沒有特殊的無窮大或NaN值,因此拋出異常是一種有用的行為肠阱。
* 3. Float 和 Double 的包裝類中定義了: NaN POSITIVE_INFINITY NEGATIVE_INFINITY
*/
public class TestFloatDouble {
public static void main(String[] args) {
float byteNum = ((byte) 1) / 0.0f;
float byteNumZero = ((byte) 0) / 0.0f;
System.out.println("byte 非0 / 0.0f = " + byteNum + " byte 0 / 0.0f = " + byteNumZero);
float shortNum = ((short) 1) / 0.0f;
float shortNumZero = ((short) 0) / 0.0f;
System.out.println("short 非0 / 0.0f = " + shortNum + " short 0 / 0.0f = " + shortNumZero);
float intNum = 1 / 0.0f;
float intNumZero = 0 / 0.0f;
System.out.println("int 非0 / 0.0f = " + intNum + " int 0 / 0.0f = " + intNumZero);
float longNum = 1l / 0.0f;
float longNumZero = 0l / 0.0f;
System.out.println("long 非0 / 0.0f = " + longNum + " long 0 / 0.0f = " + longNumZero);
float floatNum = 1f / 0.0f;
float floatNumZero = 0f / 0.0f;
System.out.println("float 非0 / 0.0f = " + floatNum + " float 0 / 0.0f = " + floatNumZero);
float charNum = (char)1 / 0.0f;
float charNumZero = (char)0f / 0.0f;
System.out.println("char 非0 / 0.0f = " + charNum + " char 0 / 0.0f = " + charNumZero);
double doubleNum = 1.0d / 0.0d;
double doubleNumZero = 0.0d / 0.0d;
System.out.println("double 非0 / 0.0f = " + doubleNum + " double 0 / 0.0f = " + doubleNumZero);
float temp = (float) 139 / 190;
float currentProgress = temp * 100;
System.out.println(currentProgress);
float tem = 222 / 0.0f;
System.out.println("tem " + tem);
float temp1 = 0.0f / 0.0f;
System.out.println("tem1 " + temp1);
System.out.println("Float.NaN " + Float.NaN);
System.out.println("Float temp1 == NaN " + (temp1 == Float.NaN));
System.out.println("Float temp1 is NaN " + Float.isNaN(temp1));
System.out.println("Float intBitsToFloat " + Float.intBitsToFloat(0x7fc00000));
float negativeInfinity = Float.NEGATIVE_INFINITY;
float positiveInfinity = Float.POSITIVE_INFINITY;
System.out.println("Float negativeInfinity " + negativeInfinity + " positiveInfinity " + positiveInfinity);
System.out.println("------double的處理類似于float---------");
}
}
注意
- 自己學(xué)習(xí)票唆,不為盈利
- 如有侵權(quán),可以聯(lián)系刪除