2011-02-09 5 views
4

누구든지 응용 프로그램에서 카 한 합계를 사용 했습니까? 추가 정밀도는 언제 유용할까요?카한 합계

일부 플랫폼에서는 double 연산이 float 연산보다 빠르다고 들었습니다. 내 컴퓨터에서 어떻게 테스트 할 수 있습니까?

+1

"내 컴퓨터에서 어떻게 테스트 할 수 있습니까?" - 타이밍으로! –

+0

당신은 float 연산이 더 빠르다가 double을 의미합니까? 정밀도를 줄임으로써 계산 속도를 높이려는 시도는 IMO에 대한 대담한 생각입니다. – Anycorn

+1

@aaa : 특정 상황에서 복식이 더 빠르다 고 생각할 수 있습니다. 인텔 FPU가 기본적으로 배정 밀도이므로 플로트에서 또는 플로트로 모든 것을 변환하는 데 시간이 오래 걸릴 수 있습니다. –

답변

6

Kahan summation은 숫자를 합산 할 때 잘 작동하며 최악의 경우 부동 소수점 오류를 최소화해야합니다. 이 기술이 없으면 사용 가능한 유효 자릿수 (예 : 1 + 1e-12)에 따라 크기가 다른 두 개의 숫자가있는 경우 추가 작업에서 정밀도가 크게 떨어질 수 있습니다. 카 한 총합은이를 보상합니다.

그리고 점 문제를 떠위한 훌륭한 자원이 여기에있다 "부동 소수점에 대해 어떻게 단언 컴퓨터 과학자을 알아야한다"배정 밀도 성능 대 하나에 http://www.validlab.com/goldberg/paper.pdf

: 예, 단 정밀도가 훨씬 빠를 수 있지만, 수 특정 기계에 따라 다릅니다. 참조 : http://www.hpcwire.com/features/17885244.html

테스트하는 가장 좋은 방법은 단일 (부동 소수점) 및 배정도 모두를 사용하여 관심있는 연산을 테스트하고 런타임을 측정하는 간단한 예제를 작성하는 것입니다.

+2

Kahan 알고리즘을 사용하는 곳 중 하나가 [java.util.stream.DoublePipeline # average] (https://github.com/frohoff/jdk8u-jdk/blob/master/src/share/classes/java/util)입니다. /stream/DoublePipeline.java#L422). –

0

평균을 계산할 때 누적 된 오류를 보상하기 위해 카 한 (Kahan) 합계를 사용했습니다. 상당한 차이가 있으며 쉽게 테스트 할 수 있습니다. 난 단지 100 개의 합계 후에 오히려 큰 오류를 제거했습니다.

나는 모든 합계의 오류를 보완하기 위해 Kahan 합산 알고리즘을 사용합니다.

그러나 역 행렬 곱셈을 할 때 꽤 큰 (1e-3) 오류가 있음을 발견했습니다. 기본적으로 A*x = y, 그 다음 inv(A)*y ~= x 정확히 원래 값을 얻지 못합니다. 어떤 것이 좋지만 Kahan summation이 도움이 될 것이라고 생각했습니다. 특히 3 x 3 이상의 큰 행렬을 사용하면 더 많은 도움이 될 것입니다. 4 x 4 매트릭스로 시도했지만 상황을 전혀 개선하지 못했습니다.