2012-05-26 2 views
13

나는 새로운 코드를 손으로 제작하고있다. 나는 돌이 더듬 거리지 않도록 해두 고 싶다.부동 소수점 논리의 올바른 코드 적용 범위를 생성하는 방법은 무엇입니까?

코드 집약을 지정하여 Pex를 안내하여 수치 집약적 인 코드에서 좋은 적용 범위를 생성 할 수있는 구체적인 방법이 있습니까?

배경 정보를 보려면 'float'키워드로 http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf을 (를) 검색해보십시오.

산술 제약 부동 소수점 숫자 이상은 유리수에 번역에 의해 근사하고, 휴리스틱 검색 기술은 포인트 제약을 떠 대략적인 해결책을 찾기 위해 Z3의 외부에서 사용된다.

...도 ...

기호 추론. Pex는 자동 구속 조건 해결사를 사용하여 테스트 및 테스트중인 코드에 관련된 값을 결정합니다. 그러나 제약 조건 해결사의 기능은 항상 제한되어 있습니다. 특히, Z3은 부동 소수점 연산에 대해 정확하게 추론 할 수 없습니다.

또는 .NET에서 숫자 기형을 찾는 작업에 더 적합한 도구를 알고 계십니까? 나는 http://fscheck.codeplex.com/을 알고 있지만 상징적 추론을 수행하지 않습니다.

+2

'float'의'=='관련 조건을 피하십시오. 대신 '<' or '>'을 사용하십시오. '=='를 사용해야한다면, 관심있는 엡실론의 공차에 대해'Math.Abs ​​(value - target) <엡실론 '이라는 표현식을 사용하십시오. '합리적인 근사치 '때문에'=='관계가 성공하기를 원할 때 너무 자주 실패합니다. 그러나 Pex는'<'를 다루는 더 쉬운 시간을 가져야합니다. –

+0

@JesseChisholm 저는 이러한 코딩 오류를 찾을 수있는 정적 분석 도구에 대해 알고 있습니다. 나는이 질문에 어떻게 도움이되는지 확신하지 못한다. – GregC

+0

@GregC, 나는 당신이 무엇을 요구하고 있는지 이해할 수 없다. 부동 소수점 숫자를 포함하는 조건문이 엡실론 허용 오차를 사용하는지 또는 (B) 알고리즘이 수치 적으로 안정적인지 또는 (C) 단순히 코드 적용 도구에 대한 권장 사항을 알고 싶습니까? 또는 다른 것? –

답변

1

원하는 서비스가 무엇입니까? 코드 조각에있는 모든 브랜치를 실행하는 테스트를 수행하는 것이 실제로 올바른 것을 의미하지는 않을 것입니다. 종종 코너 케이스에 대한 것이고, 개발자는 이러한 코너 케이스가 무엇인지 알기 가장 좋습니다. '여기에는 흥미로운 입력 조합이 있습니다'라고 말하는 것만으로도 효과가있는 것처럼 들리는 반면, 원하는 것은 시스템에서 바라는 시스템의 동작을 지정하는 것입니다. 처음에 코드를 잘못 작성한 경우 흥미로운 입력이 올바른 코드와 전혀 관련이 없을 수 있습니다.

어쩌면 이것은 당신이 찾고있는 해답이 아닐지 몰라도, 최선의 방법은 손으로하는 것입니다. 코딩을 시작하기 전에 스펙을 적어두고 클래스/서브 시스템에 대한 API를 작성하고 있음을 알 때 테스트 케이스로드로 변환하십시오.

API 작성/코드 작성을 시작하면 추가 비트와 조각을 골라야 할 때 + 어려운 비트가 무엇인지 알아낼 수 있습니다. - 조건부 등이있는 경우 누군가 당신의 코드를 리팩토링하는 것은 잘못되었을 수 있으며 그 코드를 다루는 테스트 케이스를 작성하십시오. 때로는 의도적으로이 지점에서 코드를 잘못 작성하고 실패한 테스트를 가져온 다음 테스트를 통해 코드가 올바른 경로를 검사하는지 확인합니다.

그런 다음 음수 입력, null 등을 포함하는 이상한 값을 생각해보십시오. 종종 이러한 것들은 유효하지 않으므로 고려하지 않으려 고합니다. - 이런 경우에는 일반적으로 예외를 던져야한다고 말하는 몇 가지 테스트를 작성합니다. 기본적으로 잘못된 데이터가있는 경우 올바르지 않은 경우 코드를 오용하는 것을 기본적으로 막습니다.

수치 집약적 인 코드로 작업하고 있다고 상기 언급 했으니까요 - 위의 레벨을 테스트 해 볼 가치가 있습니다. 번호 계산이 아닌 시스템에서 동작을 테스트 할 수 있습니다. 코드가 아닌 것으로 가정합니다. 순전히 수치 적으로 이것은 실행의 실질적인 조건을 확립하는 데 도움을 줄 것이며 숫자 계산 비트가 실제로 필요한 모든 프로그램이 원하는 방식으로 프로그램과 상호 작용하도록 보장합니다. 알고리즘 알고리즘을 사용하면 더 나아질 수 있습니다. 수락 테스트 언어를 작성하여 원하는 결과물이 다른 상황에 어떤 특징이 있는지 파악할 수 있습니다.이를 통해 달성하고자하는 것을 명확하게 파악할 수있을뿐만 아니라 시스템을 통해 대량의 (실제) 데이터를 던질 수 있습니다. 컴퓨터 생성 입력보다. 이것의 또 다른 이점은 알고리즘이 새로운 요구 사항을 충족시키기 위해 과감한 재 작성이 필요하다는 것을 알고 있다면 새로운 테스트 케이스를 추가 한 다음/refactor를 다시 작성해야한다는 것입니다. 테스트가 알고리즘의 세부 사항을보고 외부 세계에 미치는 영향을 가정한다면 알고리즘이 현재 행동에 어떻게 영향을 주는지, 어떤 부분이 정확하고 어느 부분이 효과적이지 않은지, 그리고 그 다음에 시도하려고하는 두통이 심하게 느껴질 것입니다 단위 테스트로드를 새 API/알고리즘으로 마이그레이션하십시오.

+0

물론 지금은 정확히 끝났습니다. 제가 말씀 드리고 싶은 것은 필드 데이터가 가져올 수있는 문제점을 미리 추측하지 않고 컴퓨터로 생성 된 테스트 데이터 세트를 조사하는 것입니다. 수치 해석을 공부했다면, 이것은 당신에게 의미가있을 것입니다. 특히 오버플로 및 언더 플로우와 같은 수치 오류를 발생시키는 합리적 형식의 데이터를 찾는 데 관심이 있습니다. 이러한 문제는 종종 계산 상 복잡하며 찾기에 가장 좋은 도구입니다. – GregC

+0

다음은 자동화 된 문제 해결 도구를 사용하여 단순화 된 탐색의 예입니다. http://www.mathworks.com/matlabcentral/newsreader/view_thread/278975 – GregC

+0

그 사람의 문제에 대한 해결책이 무엇인지 알 수 없습니다. - 생성 된 테스트 데이터에서 찾을 수있는 것이 었습니까?부동 소수점 수를위한 매우 큰 검색 공간이 있어야합니다 - pdx에서 pex가 이들에 대해 정확하게 추론 할 수 없다고 말하는 것 같습니다. 재미있는 문제는, 미안해 더 도움이 될 수 없어! –

관련 문제