2009-05-27 4 views
3

기울기 계산의 정확성을 향상시킬 수있는 방법이 있는지 알고 싶습니다. (이것은 몇 달 전까지 here으로 나타났습니다).부동 소수점 방정식을 다시 적용

이 변경 보인다

float get_slope(float dXa, float dXb, float dYa, float dYb) { 
    return (dXa - dXb)/(dYa - dYb); 
} 

float get_slope(float dXa, float dXb, float dYa, float dYb) { 
    return dXa/(dYa - dYb) - dXb/(dYa - dYb); 
} 

에 개선 될 수 있습니다. 제안?

편집 : 정확도, 효율성이 아닙니다.

+0

어떤 언어를 사용하고 있습니까? –

+1

C. 그러나 나는 그것이 사람들의 반응을 어떻게 받아 들일지 궁금합니다. – Jamie

+0

옆 : 부동 소수점 숫자는 정말 이상합니다. 0에 가까울수록 정확도가 높아집니다. 즉, [0.9.1] 범위보다 [0,0.1] 범위에서 더 많은 값을 나타낼 수 있습니다. 대부분의 프로세서는 0에 가까운 "비정규 모드"모드로 전환됩니다. 한동안 인텔 칩 중 일부는 신호 처리 애플 리케이션 (특히 LP 필터)에 등장한 비정규 화일 (denormal spikes)과 디지털 처리를 위해 AMD에 권장하는 비정상 처리를 처리하는 데 너무 많은 시간이 걸렸다. 사람들은 실제로 속도가 느린 곳을 대상으로 0에 가까운 소량의 소음을 추가했습니다. – Nosredna

답변

1

나는 오타가 있다고 생각합니다. 아마

내가 말했듯이 당신은 더 높은 정밀도를 가졌다. dXa와 dXb가 가깝고 크다면 빼기 전에 두 부분에서 정밀도를 잃을 것입니다.

+0

'Close and large': '큰'부분이 당신의 주장에 어떻게 기여하는지 보지 못합니다. dX가 가깝다면 그 차이는 크기에 관계없이 작을 것입니다. 내 말은, 그것이 플로팅 포인트 야, 맞지? – Jamie

5

기능 내에서 double으로 전송하십시오. 분모가 제로 근처 때 문제로 실행하는거야


은 분명하다. 당신의 경사는 무한대에 접근 할 것입니다. 그래서 많은 것은 사면에서 무엇을하고 싶은지에 달려 있습니다. 때로는 델타 y가 0에 가까울 것임을 알게되면 기울기의 역수를 계산하여 대신 사용할 수 있습니다. delta 또는 deltay의 절대 값과 기울기 또는 1/기울기를 반환하여 더 작은 값을 감지 할 수도 있습니다. atan2()도 살펴보십시오.


당신이 입력이 소수에 알고, 당신은뿐만 아니라 소수의 출력을 원하는 경우에, 당신은 십진수로 모든 계산을 수행하여 다시 바이너리 수레를 변환에 내재되어 정밀도의 손실을 극복 할 수 도서관. 나는 6502의 BCD 모드를 사용했기 때문에 Atari BASIC을 십진법 계산에 사용했을 때 얼마나 기뻤는지 기억합니다.

+0

제로에 가까운 부문은 괜찮습니다. 결과가 + INF 또는 -INF 인 경우에도 괜찮습니다. 경사가 똑바로 위아래인지 알고 싶습니다. – Jamie

+0

요점은 당신이 슬로프로 무엇을 할 것인가에 달려 있다는 것입니다. 기울기를 사용하여 계산을 수행하는 경우 함수에서 기울기 계산을 끌어와 기울기를 사용하는 수식에 인라인으로 배치하는 것이 좋습니다. 그렇다면 정밀 문제에 대한 방정식을 전체적으로 볼 수 있습니다. – Nosredna

1

몇 가지 추가 사이클을 불편하게 만들면 루프를 수행하여 정확도를 높일 수 있습니다.

A와 B.

사이의 선분의

계산 슬로프 {(XA - (XA -Xb)) (아 - (아 -Yb)} 사이의 선분의

계산 기울기와 {(XB ... 기본적으로 A - 기울기와 B + 기울기

그런 다음 결과 기울기를 비교합니다. 차이가 너무 큰 경우 (임계 값을 선택하십시오 끝까지 모든 슬로프의 평균을 구하십시오.

이렇게하면 매우 작은 경사면에서 부동 소수점 산술로 인한 예외를 부드럽게 할 수 있습니다.

+0

흥미를 돋우는 것, 그리고 내가이 일을 끝내는지는 정말로 내가 찾던 '대답'이 아니다. 이것은 간단한 'rejigging'보다 알고리즘 솔루션입니다. – Jamie

+0

글쎄, 당신은 "경사 계산의 정확도를 향상시킬 수있는 방법이 있는지 알고 싶습니다."라고 물었습니다. 안타깝게도 대답은 Nosredna가 제안한대로 속임수를 쓰고 두 배로 캐스팅하는 것 이상입니다. – patros