2016-04-03 12 views
0

ich von double[] Array (Größe von mehr als 180,000,000) Durchschnitt erhalten möchten, aber ich war über diese Situation denken:erhalten Durchschnitt von großen Doppel Zahlen von Doppel Array mit enormen Größe mit Hilfe von Java

double d0 = Double.MAX_VALUE; 
double d1 = d0 - 1.0; 
double d2 = d1 - 1.0; 
double da = (d0 + d1 + d2); 
double db = da/3.0; 
System.out.println("d0:" + d0 + ", d1:" + d1 + ", d2:" + d2 + ", da:" + da + ", db:" + db); 

Der Ausgang:

d0:1.7976931348623157E308, d1:1.7976931348623157E308, d2:1.7976931348623157E308, da:Infinity, db:Infinity 

Antwort

-1

Ihr Problem ist im Umgang mit dem Überlauf des doppelten Wertes. Ich schlage vor, BigDecimal zu verwenden, um dies zu umgehen, wie dokumentiert here. Hier sehen Sie ein Beispiel für eine Implementierung Ihres Codes mit BigDecimal.

import java.math.BigDecimal; 

public class test 
{ 
    public static void main (String [] args) 
    { 
     BigDecimal d0 = new BigDecimal(0); 
     BigDecimal d1 = new BigDecimal(0); 
     BigDecimal d2 = new BigDecimal(0); 

     d0 = d0.add(BigDecimal.valueOf (Double.MAX_VALUE)); 
     d1 = d1.add (d0.subtract (BigDecimal.ONE)); 
     d2 = d2.add (d1.subtract (BigDecimal.ONE)); 

     BigDecimal da = d0.add (d1.add (d2)); 
     BigDecimal db = da.divide (BigDecimal.valueOf (3)); 

     System.out.printf("d0: %s, \nd1: %s, \nd2: %s, \nda: %s, \ndb: %s\n", d0, d1, d2, da, db); 
    } 
} 

Dieser druckt die folgenden (verkürzt) aus:

d0: 179769313486231570000...00, 
d1: 179769313486231569999...99, 
d2: 179769313486231569999...98, 
da: 539307940458694709999...97, 
db: 179769313486231569999...99 

Sie Ihre Antwort mit Hilfe d0.toEngineeringString formatieren können(), zum Beispiel.

1

Versuchen mit diesem:

public static double getAverageValueArray(double[] dArray) { 
    double dValue = 0.0; 
    if (dArray == null) { 
     throw new IllegalArgumentException("The array must be defined or diferent to null"); 
    } 
    if (dArray.length == 0) { 
     throw new IllegalArgumentException("The array must have size greater than zero"); 
    } 
    for(int i = 0 ; i < dArray.length ; i++) { 
     dValue += dArray[i]/dArray.length; 
    } 
    return dValue; 
    } 
+0

Sie haben nicht wirklich die Tests benötigen. Sie verdunkeln nur Ihre tatsächliche Lösung. Die erste Bedingung wird sowieso eine NPE werfen, was geeigneter ist, und die zweite Bedingung wird nur eine Ausnahme mit einer Division durch Null ergeben, was angemessen ist, wenn keine Eingabewerte vorhanden sind. – EJP

+0

@EJP Der zweite Test wird benötigt. Ohne dieses Element gibt es für ein Array mit einer Länge von null keine Unterteilungen, und die Methode gibt 0, den Anfangswert von dValue, zurück. Sie könnten über die üblichere Mittelwertberechnung nachdenken, bei der die Division außerhalb der Schleife durchgeführt wird. –

Verwandte Themen