簡體   English   中英

Java浮點整數算術

[英]Java Floating point Integer arithmetic

鑒於輸出的布爾值下面的代碼是

A: false
B: false
C: true

當我試圖用小於65的任何東西減去V1 + V2之和時不起作用,就好像減法永遠不會發生一樣。 如果我將原語切換為double,問題就解決了。 為什么會這樣?

private static final float V1 = 1076712940;
private static final float V2 = 1070770707;

public static void main(final String[] args) {
    final float y = V1 + V2;//2147483647

    System.out.println("A: ((y - 64) - 1) == (y - 65) --> "
                        + (((y - 64) - 1) == (y - 65))); /* A */
    System.out.println("B: (y > y - 64) --> " + (y > y - 64)); /* B */
    System.out.println("C: (y > y - 65) --> " + (y > y - 65)); /* C */
}

浮點數由符號位,尾數和指數表示在存儲器中,它們基本上是二進制分數。 許多十進制數不能完全表示為二進制分數。 在指數或尾數中具有附加位將允許更高的精度水平。

我相信在你的情況下,你已經保存的浮點數和減少64的值之間的差異不是一個足夠大的變化,以具有不同的浮點表示。 但是,因為double在尾數和指數中有額外的位,所以它可以更精確,並准確地表示減法。

這在先前的答案上略有擴展。

原始程序在評論中包含y為2147483647的聲明。事實並非如此。 由於浮點舍入,它是2147483648.該程序查看y ,以及包含它的可表示數字。 BigDecimal的toString在沒有科學記數法的情況下進行精確轉換,對於這種情況更清楚。 BigDecimal還對具有有限長度十進制擴展的數字進行精確算術,包括所有有限浮點數和雙數。

import java.math.BigDecimal;

public class Test {
  private static final float V1 = 1076712940;
  private static final float V2 = 1070770707;

  public static void main(String[] args) {
    final float y = V1 + V2;// 2147483647
    BigDecimal yBD = new BigDecimal(y);
    System.out.println("y = " + yBD);
    BigDecimal down = new BigDecimal(Math.nextDown(y));
    System.out.println("nextDown(y) = " + down + " diff = " + yBD.subtract(down));
    BigDecimal up = new BigDecimal(Math.nextUp(y));
    System.out.println("nextUp(y) = " + up + " diff = " + up.subtract(yBD));
    System.out.println(Float.MAX_VALUE + Float.MAX_VALUE);
  }

}

輸出:

y = 2147483648
nextDown(y) = 2147483520 diff = 128
nextUp(y) = 2147483904 diff = 256
Infinity

2147483648是2的冪,所以它下面的間隙只有128,但是上面的間隙是256.減去任何小於64的東西的確切結果比任何其他可表示的數字更接近2147483648。 減去64給出了兩個數字之間中間的精確結果,並且朝向2147483648進行了舍入到偶數舍入。減去65具有更接近2147483520的精確結果。

在評論中,你問:“我將V1V2都切換為Float.MAX_VALUE結果改變了A:true B:false C:false你對此有何看法?”

我的第一個想法,從我的程序的最后一個輸出證實,是“這讓y無限。”。 在無窮大中添加或減去有限數不會改變其值。 無窮大等於它自己。

一般來說,如果直接查看所涉及的數字,而不是只查看測試結果和涉及它們的比較,就會更容易看到發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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