2012-04-26 2 views
0

에 대한 자바 스크립트에서 복잡한 숫자의 복잡한 힘의 계산을 최적화 :나는 복잡한 숫자의 복잡한 힘을 계산이 코드를 가지고 정확성

var ss = a.re*a.re + a.im*a.im; 
var arg1 = math.arg(a); 
var mag = Math.pow(ss,b.re/2) * Math.exp(-b.im*arg1); 
var arg = b.re*arg1 + (b.im * Math.log(ss))/2; 
return math.complex(mag*Math.cos(arg), mag*Math.sin(arg)); 

(복소수의 모습 {재 : 1, 메신저 : 1} , math.arg는 Math.atan2 (n.im.n.re)를 제공합니다. math.complex는 복소수의 생성자입니다.

특별히 복잡하지는 않습니다. 효율/정확도 분석.

특히 복소수의 정수 배수에 대한 더 나은 결과를 얻으려면 바이너리 확장을 통해 훨씬 더 정확하게 수행 할 수 있습니다. 누구든지 이미 내 서부를 만들기 전에 자바 스크립트에 으로 쓰여진 내용이 있습니까? 나는 속도에 대해 크게 걱정하지 않는다. 정확성에 대해서도 더 그렇다.

답변

0

그래서 코드가 복소수를 극형으로 바꾼 다음 기본 지수 규칙을 적용합니다.

당신은 당신이 정확성에 대해 우려하고 말할^N = [n 번째 다항식 확장]

당신이 (A + BI) 같은 것을 선호하는 거라고 주장한다. 당신은 자바 스크립트를 사용하는 경우, 그 정확성에 대한 우려로 위험하다 :

내가

  • 자바 스크립트 숫자 생각할 수있는 부정확성의 세 가지 소스가 있습니다. 정수는 실제로는 수레 (float)이며, 매우 큰 수로 작업 할 경우 정수로 정밀 오류를 얻을 수 있습니다. 경고 받다.
  • 수학 함수 : Math.pow 및 Math.atan2가 얼마나 정확하게 결과를 계산합니까? 필요한 경우 조사 할 수 있습니다.
  • 반올림 오류 : 도메인/이미지와 관련하여 작업의 범위/이미지를 확장하는 많은 수의 작업을 수행하면 반올림 오류가 복합 될 수 있습니다.

또한 다항식 확장으로 z^n을 계산할 때 O (n) 시간과 O (n) 공간이 필요하며 이는 절대적으로 끔찍한 문제입니다.

O (log (n)) 시간과 O (1) 또는 O (log (n)) 공간을 사용할 수 있습니다 (이전 O (1) 지수 n을 이진 표현으로 분해함으로써.

결국에는 부동 소수점 표현을 계산할 수 있습니다. (기본적으로) 하나의 연산을 수행 할 수있는 경우, 계산을 위해 긴 일련의 연산을 수행 할 이유가 없습니다. 그 작업이 엄청나게 부정확하지 않다면, 수행하는 작업이 적어 질수록 오류가 적어 질 것이라고 기대해야합니다.

정확도에 훨씬 더 큰 영향을주는 것은 작업 할 것으로 예상되는 숫자의 분포 (매우 작음, 매우 큰 것, 둘 다 등) 및 표현의 선택입니다 (예 : 자연스럽게 표현하려고 선택한 경우). 극성 또는 데카르트 형태). 예를 들어 더하기 및 빼기를 많이 할 계획이라면, 반올림 오류를 줄이고 직교 좌표로 속도를 높이십시오. 곱셈, 나눗셈 및 지수화를 많이하거나 지수 스케일로 작업 할 계획이라면 극단적으로 반올림 오류가 적고 속도가 빨라질 수 있습니다.

+0

당신은 무엇을 의미합니까? '(1 + i)^5'는'1^5 + i^5'와 같지 않습니다. –

+0

@ChristianPerfect : 오, 죄송합니다. 나는 "스피드와 정확도에 대해 크게 걱정하지 않는다"고 말한 것을 보지 못했습니다. 효율성/정확성 분석에 대한 귀하의 의견 때문에 당신이 효율성에 대해 걱정한다고 암시한다고 가정했습니다. 내 대답을 편집 할 것입니다 ... – ninjagecko

+0

이것은 브라우저 기반 수학 평가 시스템의 일환으로 일반 수학 패키지 용이므로 특히 큰 숫자를 사용하지 않을 것으로 예상됩니다. 나는 정수 계수가 어디에서나 가장 보편적으로 사용될 것이라고 생각한다. 이것도 문제가되었던 이유는 (1 + i)^5가 logs-and-trig 방법을 사용하여 {re : -4.0000000001, im : -4}으로 평가 되었기 때문에 매우 귀찮습니다. –

0

만 정수 능력에 대해 걱정하는 경우, 가장 정확한 그냥 곱해하는 것입니다 :

var Re = 0, Im = 1; 
var newRe = 1, newIm = 0; 
var retRe = 1, retIm = 0; 
for(var i = 0; i < n; i++) 
{ 
    newRe = retRe * Re - retIm * Im; 
    newIm = retRe * Im + retIm * Re; 
    retRe = newRe; 
    retIm = newIm; 
} 
+0

그건 나쁜 생각이 아니에요! –