2011-04-19 4 views
5

Java 6을 사용하여 의료 기기에서 데이터를 읽는 도구를 설계하고 있습니다.자바에서 가변 클래스로 고정밀도 계산을 수행하는 방법은 무엇입니까?

각 의료 기기 제조업체는 자체 펌웨어/프로토콜을 구현합니다. 제조업체 (나 같은)는 이 제조업체의 펌웨어 명령을 사용하여 의료 기기에서 데이터를 수집하는 자체 인터페이스를 작성합니다. 대부분의 펌웨어는 데이터를 비밀스러운 방식으로 출력하므로 공급 업체가 데이터를 수신하면 실제 값을 계산하기 위해 데이터를 계산하여 데이터를 스케일링해야합니다.

그 나는 모든 수치 계산을하고 최종 값을 저장의 BigDecimal을 사용하는 결론에 도달했습니다

의료 데이터의 정밀도 등 금융 데이터의 정밀도만큼 중요하다고 가정하는 것이 안전합니다. 매초마다 새로운 데이터 세트를 받게 될 것입니다. 즉, 계산을 수행하고 매초 동일한 값 세트를 업데이트 할 것입니다. 예 : 호흡 할 때마다 인공 호흡기에서 데이터가 전달됩니다.

BigDecimal은 불변이므로, 매초마다 힙에서 생성되는 객체의 수에 대해 걱정하고 있습니다. 특히 도구가 동시에 50 개의 장치를 말하는 데이터를 읽도록 확장해야하기 때문에.

나는

질문

  1. 내가 사용할 수의 BigDecimal의 가변 사촌이 있는가

    .... 내 질문의 여전히 여기에 힙 크기를 증가시키고 모든 것을 할 수 있지만?

  2. 이와 비슷한 기능을하는 기존의 오픈 소스 프레임 워크가 있습니까?

  3. Java가 이러한 종류의 기능에 적합한 언어입니까?

  4. 내가 Apfloat를 조사해야합니까? 그러나 Apfloat 역시 변하지 않습니다. JScience는 어떻습니까?

  5. 난 단지 10 개까지 자리의 정밀도를 목표로하고있어

  6. 내가 높은 정밀도에 사용할 수있는 자바에 대한 모든 수학 라이브러리. 그 이상은 필요하지 않습니다. 그렇다면이 유형의 정밀도를위한 최상의 라이브러리 또는 작업 과정은 무엇입니까?

답변

2

BigDecimal이 사용자의 요구에 맞지 않는다는 결론에 도달하기 전에 실제로 시나리오를 프로파일 링하는 것이 좋습니다. 불변의 자연이 시나리오에 중요한 영향을 미친다는 것은 당연한 결론은 아닙니다. 현대의 JVM은 많은 양의 객체를 할당하고 파괴하는 데 매우 좋습니다.

0

정확도가 10 자릿수 인 경우 두 배를 사용하면됩니다. 정확도는 16 digits입니다.

+0

@ Alex, @ AaronD and @Bobby - 나는 10 자리의 정밀도를 언급하지 말았어야했다 .... 나는 잘못된 프레이징을 사용했다고 생각한다. 내가 주위에 google 때, 대부분의 사람들은 부동 소수점/double을 사용할 때 계산에서 부정확성에 대해 이야기합니다. 그래서 BigDecimal을 고집하고 싶습니다. [예 : http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html] – FatherFigure

0

프리미티브 유형은 십진법 정밀도가 약 16 자리이며, 왜 사용하지 않는 것이 좋을까요? 그러면 힙을 전혀 건드리지 않을 것입니다.

0

구체적으로 말하면 10 자리 만 유효합니다. 2 진수 또는 10 진수를 고려하고 있는지 여부는 알 수 없지만 표준 64 비트 IEEE 부동 소수점 (Java double)은 52 진수 (약 16 진수)를 제공하며 사용자의 요구를 훨씬 능가합니다.

그러나 입력 번호에 적용하는 연산의 수치 안정성에 대해 생각해 보는 것이 좋습니다. 예를 들어, Math.log() 및 Math.exp()는 입력 범위에 따라 예기치 않은 영향을 미칠 수 있습니다 (경우에 따라 Math.log1p() 및 Math.exp1m()이 더 적합 할 수도 있지만 다시 - 수행중인 특정 작업에 따라 다름).

0

가비지 컬렉터는 객체를 깨끗이 청소해야합니다.하지만 여전히 불변의 Numbers가 필요하다면, 반사를 사용하여 항상 BigDecimal의 백 데이터에 액세스 할 수 있습니다. 그러면 래퍼 클래스를 생성 할 수 있습니다. BigDecimal을 사용하면 원하는 것을 할 수 있습니다.

관련 문제