[英]Sorting (a stream of) doubles by absolute magnitude
我有一系列雙值,我想總結並獲得最大值。 DoubleStream.summaryStatistics()
聽起來很完美。 getSum()
方法有一個API注釋提醒我在我的一個計算機科學課程中學到的東西:如果值按其絕對值排序,求和問題的穩定性往往會更好。 但是, DoubleStream
不允許我指定要使用的比較器,如果我在流上調用sorted()
,它將只使用Double.compareTo
。
因此,我將值集合到final Stream.Builder<Double> values = Stream.builder();
並打電話
values.build()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
然而,這看起來有點冗長,我寧願使用DoubleStream.Builder
而不是通用構建器。 我是否遺漏了某些東西或者我是否真的必須使用盒裝版本的流才能指定比較器?
原始流沒有重載的sorted
方法,並將按自然順序排序。 但回到你的根本問題,有一些方法可以提高總和的准確性,而不涉及首先對數據進行排序。
一種這樣的算法是Kahan求和算法 ,它恰好由OpenJDK / Oracle JDK在內部使用 。
這無疑是一個實現細節,因此通常的警告適用(非OpenJDK / Oracle JDK或未來的OpenJDK JDK可能采取其他方法等)
另見這篇文章: 應該添加浮點數以獲得最精確的結果?
排序DoubleStream
的唯一可能方法是對其進行打包/取消裝箱:
double[] input = //...
DoubleStream.of(input).boxed()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
然而,由於Kahan求和在內部使用,差異應該不是很顯着。 在大多數應用中,未排序的輸入將產生良好的結果准確性。 當然,您應該自己測試未分類的總和是否滿足您的特定任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.