불안정한 부동 소수점 계산을 식별하는 방법은 무엇입니까?


15

숫자에서는 불안정한 체계를 식별하고 안정성을 향상시키는 것이 매우 중요합니다. 불안정한 부동 소수점 계산을 식별하는 방법은 무엇입니까?

많은 수치 체계가 함께 작동하는 매우 복잡한 시뮬레이션을 진행 중이며 약한 부분을 식별하는 방법을 찾고 있습니다. 미분 방정식과 관련된 물리적 모델을 연구 중입니다. 전체 프로세스의 조감도는 다음과 같습니다.

  1. (예비 단계) 실제 관측 수집 P를 .

  2. 시뮬레이션의 초기 매개 변수를 결정하십시오. 이것은 최적화 알고리즘을 사용하는데, 여기서 우리는 매개 변수 공간을 걷고 일부 오류 함수 E (F (C), P) 가 최소화 되도록 매개 변수 C를 찾습니다 . 여기서 F 는 매개 변수의 파생 수량입니다.

  3. 플러그 C 시뮬레이션 엔진이다. 이것은 EDP의 오일러 체계이므로 매번 단계마다 역 동성을 유도하는 용어를 계산하고 (각각 복잡한 기능이며 잠재적으로 불안정 할 수 있음) 오일러 체계에 이러한 동적 용어를 공급하여 다음을 계산합니다. 상태. 이것은 수천 시간 동안 계속됩니다.

  4. 시뮬레이션이 끝나면 최종 상태 S 의 일부 Proof (S) 함수를 계산 하고 관찰 된 수량에서 추론 된 Require (P) 수량과 비교합니다 . 이것은 결과에 대한 공식적인 증거가 아니며, 타당성 점검입니다.

또한 복잡한 작업 타워 (Euler 체계 내, Proof 내에서 동적 용어 계산 )를 봅니다. 그리고 "나쁜 부분"을 인식하고 수정하고 싶습니다.

부동 소수점 수의 소프트웨어 구현을 정확도를 낮추면 수치 체계의 불안정성이 확대되어 다른 구현 간의 비교가 쉬워 질 것이라고 추측합니다. 이 질문을 조사하는 일반적인 기술입니까? 프로그램을 변경하지 않고 가상 머신을 Bochs로 사용하여이를 달성 할 수 있습니까?

안정성 문제를 적절하게 처리하기 위해 수치 절차의 일반적인 입력을 목표로하는 것이 허용 될 수 있으므로 해당 입력에 대해 잘 수행되고 다른 유효하지만 가능성이 낮은 입력에 대해서는 덜 적합하도록 조정될 수 있습니다. 일반적인 입력 샘플이 제공되면 일부 중간 결과 를 스누핑 하고 통계 프로파일을 준비 할 수 있습니다. 다시, 이것은 안정성 문제를 연구하는 일반적인 기술입니까? 가상 머신이 이것에 유용합니까?



@Simon 당신이 옳을 수도 있지만, 이것은 분명히 도메인 간 질문입니다. 나는 대답 할 수있는 사람이 수학과 프로그래머 모두에게 등록되어 있거나 아무에게도 등록되어 있지 않은 것 같다.
user40989

1
간격 산술?
SK-logic


2
오일러를 사용하여 국가를 전파하는 것이 반드시 악한 것은 아닙니다. 최적화도 아니며, 실제로 문제를 하위 작업으로 분할해야합니다. 수치 적 불안정성은 가장 큰 문제 일 수 있습니다. 허위 최대로 수렴하고 ODE / PDE의 강성과 관련된 문제가 그보다 더 큰 직기입니다. 그리고 예, 절대로 단 정밀도를 사용하지 마십시오 :)
Deer Hunter

답변:


6

부동 소수점 계산의 안정성에 대한 연구는 수치 분석의 일부이며 실제로 결과를 원한다면 해당 도메인에 대해 잘 알고있는 사람이 사용 된 알고리즘을 분석하기를 원합니다.

불안정한 알고리즘을 실험적으로 식별하는 데 도움이되는 몇 가지 사항이 있습니다. 반올림을 다른 모드 (위 / 아래 / 무작위)로 설정하거나 다른 정밀도로 실행하고 결과가 크게 변하지 않는지 확인합니다. 대답 이 너무 많습니까? 전혀 간단 하지 않으며 대답이 ' 아니오'인 경우에도 알고리즘이 안정적이라는 것을 의미하지는 않습니다. 사용 된 데이터 세트에서 불안정한 것으로 감지되지 않았다는 것입니다.

주석에서 간격 산술이 제안되었습니다. 내가 그것을 보았을 때, 가장 산만 한 산술 연산 지지자조차도 그것이 산술 산술을 위해 설계된 알고리즘과 잘 작동했지만 알고리즘을 분석하지 않고 알고리즘으로 전환하고 잘 작동하지 않는 패턴을 확인하지 않았다는 것을 인정했습니다. 유용 할 것


3

안정적인 부동 소수점 알고리즘을 설계하는 것은 쉽지 않습니다. 나보다 수학적으로 숙련 된 사람들은 자신의 롤을 시도하기보다는 가능한 한 잘 알려진 라이브러리를 사용하는 것이 좋습니다. 이 영역의 표준 참조는 다음과 같습니다.

뉴저지 Higham. 수치 알고리즘의 정확성과 안정성. 산업 및 응용 수학 학회, 미국 펜실베이니아 주 필라델피아, 제 2 판, ISBN 0-89871-521-0

어떤 유형의 계산, 언어 등을 알지 못하면 구체적인 대답을하기가 어렵습니다. 여기에 좋은 강의가 있습니다 : http://introcs.cs.princeton.edu/java/91float/ 이것은 약간 기본이지만 Java를 사용하는 경우 좋은 소개입니다.


1

불안정한 부동 소수점 계산을 식별하는 방법은 무엇입니까? 이 질문을 조사하는 일반적인 기술입니까?

오류에 대한 통계를 표시하지 않으면 실제로 샘플을 수집 할 필요가 없습니다. 당신이 필요로하는 것은 수치 해석 이 cs.stackexchange 너무 몇 가지 답변을 얻을 수 있도록 또한, 수치 방법, 수치 선형 대수, 등 그리고 컴퓨터 과학의 그들이있는 거 부분의 주제에 해당.

어쨌든 일반적인 프로그래밍에서는 부동 소수점의 작동 방식과 기본적인 수치 방법에 대한 기본적인 이해를 통해 대부분의 문제를 쉽게 발견 할 수 있습니다. 그러나 더 복잡한 문제는 오늘날 128 비트 부동 소수점의 가용성으로 해결하기가 더 쉬워지고 오류 샘플을 생성 할 이유가 훨씬 적습니다. 여기 내 요점을 보여주는 몇 가지 문제가 있습니다.

  1. 통화 값을 계산하기 위해 부동 소수점을 사용합니다.
  2. 큰 숫자에는 부동 소수점을 사용합니다.
  3. 가능하면 다른 작업 전에 분할하지 마십시오. (값을 0에 가깝게 만들기 위해).
  4. 오류 전파에 대한 특별한 처리없이 긴 계산.

여기에는 분산 계산 을위한 순진 알고리즘 및 오류 보상 알고리즘의 예가 있습니다 . 예를 들어, 순진한 버전을 보면 루프에서 계산을 수행하면 오류가 발생하고 보상되지 않는다는 냄새가 날 수 있습니다.


귀하의 답변에 감사드립니다, 그러나 나는 더 자세한 정보를 찾고 있습니다. 나는 매우 큰 계산을 가지고 약한 부분을 식별하고 싶습니다. 그에 따라 질문을 편집했습니다.
user40989

계산이 많고 약한 부분을 식별하려고 할 때 상황이 어떻게되는지 정확히 모르겠습니다. 숫자 계산에는 본질적으로 하나의 간단한 추가 연산조차도 오류가 있습니다. 따라서 큰 계산이 오류를 보상하지 않으면 전체적으로 수정해야합니다. 약한 반점을 개선하는 것만으로는 충분하지 않을 수 있습니다. 이제 부동 소수점 모델의 "엡실론"인 경우 간단한 분석을 통해 긴 계산을 통해 전파 될 때 오류가 얼마나 클 수 있는지 알 수 있습니다.
imel96

0

적절한 데이터 유형 (예 : 연속 분수)을 사용하여 숫자 오류를 피할 수 있습니다. 부동 소수점 산술을 사용하거나 사용하려면 오류를 알기 위해 수치 노하우를 적용해야합니다.


나는 숫자 오류를 피하고 싶지 않고 계산의 어느 부분이 불안정한 지 알고 싶습니다. 속도를 최적화 할 때 현지화 속도 병목 현상과 유사합니다. 그래서 정밀도를 최적화하고 싶기 때문에 정확한 병목 현상을 찾고 싶습니다. (계속 분수 여기에 유용하지 않습니다.)
user40989

1
@ user40989, 확실히 당신은 간격 산술이 필요합니다.
SK-logic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.