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?