tierra magnitudes magnitud luminosidad las estrellas ejemplos economia distancia cual bolometrica betelgeuse astronomicas astrofisica absoluta java java-8 java-stream

java - luminosidad - magnitudes astronomicas



La ordenaciĆ³n(una secuencia de) se duplica por magnitud absoluta (2)

Tengo una serie de valores dobles que quiero resumir y obtener el valor máximo. DoubleStream.summaryStatistics() suena perfecto para eso. El método getSum() tiene una nota API que me recuerda lo que aprendí durante uno de mis cursos de informática: la estabilidad del problema de suma tiende a ser mejor si los valores están ordenados por sus valores absolutos. Sin embargo, DoubleStream no me permite especificar el comparador que utilizará, solo utilizará Double.compareTo si Double.compareTo sorted() en la transmisión.

Así reuní los valores en una final Stream.Builder<Double> values = Stream.builder(); y llama

values.build() .sorted(Comparator.comparingDouble(Math::abs)) .mapToDouble(a -> a).summaryStatistics();

Sin embargo, esto parece algo largo y hubiera preferido usar DoubleStream.Builder lugar del generador genérico. ¿Perdí algo o realmente tengo que usar la versión en caja de la secuencia solo para poder especificar el comparador?


La única forma posible de ordenar DoubleStream es box / unbox it:

double[] input = //... DoubleStream.of(input).boxed() .sorted(Comparator.comparingDouble(Math::abs)) .mapToDouble(a -> a).summaryStatistics();

Sin embargo, como la suma de Kahan se usa internamente, la diferencia no debe ser muy significativa. En la mayoría de las aplicaciones, la entrada no ordenada arrojará la buena precisión resultante. Por supuesto, debe probar usted mismo si la suma no ordenada es satisfactoria para su tarea particular.


Las transmisiones primitivas no tienen un método sorted sobrecargado y se ordenan en orden natural. Pero para volver a su problema subyacente, hay formas de mejorar la precisión de la suma que no implica ordenar primero los datos.

Uno de estos algoritmos es el algoritmo de suma de Kahan que es utilizado por OpenJDK / Oracle JDK internamente .

Esto es, sin duda, un detalle de la implementación, por lo que se aplican las advertencias habituales (los JDK que no sean OpenJDK / Oracle o los futuros JDK OpenJDK pueden tomar enfoques alternativos, etc.)

Ver también esta publicación: ¿ En qué orden se deben agregar flotantes para obtener el resultado más preciso?