과학 / 엔지니어링에서 부동 소수점 숫자가 자주 사용되는 이유는 무엇입니까?


33

부동 소수점 숫자의 정확성을 조사하는 동안 몇 곳에서 다음과 유사한 진술을 보았습니다.

" float과 double이된다 ( 위해 설계 / 에서 자주 사용 ) 엔지니어링 및 과학 계산 "

내 이해에서, float와 double의 강도는 (정확하지만 완벽하지는 않지만) 정밀도를 위해 사용하는 메모리의 양입니다.

나는이 답변 에서 거의 이해를 얻고있는 것처럼 느낍니다.

"부동 소수점 수를 사용하면 연속 수량을 모델링 할 수 있습니다"

나는 아직도 내가 이해한다고 확신하지 못한다. 공학과 과학은 모두 계산에서 정확한 결과를 원할 때 필드처럼 들리지만 내 이해로는 부동 소수점이 제공하지 않습니다. 나는 또한 "연속적인 양"이 정확히 무엇인지를 확신하지 못한다.

누군가이 설명을 확장하고 예를 들어 줄 수 있습니까?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.과학과 공학 모두에서 당신은 특정 지점까지만 정밀도에 관심이 있습니다. 모든 계산에 무한 정밀도를 사용하는 것은 종종 불필요하게 비쌉니다. 부동 소수점을 고정 소수점과 구분하는 점은 소수의 소수 자릿수를 커밋 할 필요가 없다는 것입니다. 소수 자릿수가 많거나 정밀도가 제한된 양이 많을 수 있습니다.
Doval

24
위에서 언급 한 포인트를 추가하기 위해 특정 포인트 이상의 정밀도에 신경 쓰지 않을뿐만 아니라 많은 입력이 고유 한 오류가있는 측정 된 수량이기 때문에 임의로 정확한 결과를 얻을 수 없습니다 .

2
또한 반올림 오류가 계속 누적되는 것은 아닙니다. 그것은 당신이하고있는 것과 어떻게하고 있는지에 달려 있습니다. 그것에 전념 하는 전 분야 가 있습니다.
Doval

10
부동 소수점은 "무작위 정밀도"가 아니며 다양한 연산의 오류를 예측할 수 있고 잘 알려져 있으며 알고리즘의 오류를 해결할 수 있습니다. 그것들이 충분히 낮 으면 (특히 입력 변수의 비인증보다 작은 경우), 결과가 양호하거나 적어도 그로 인한 문제가 플로팅으로 인한 것이 아니라고 확신 할 수 있습니다. 포인트 에러).
hobbs

답변:


77

과학 및 공학의 계산에는 정밀도, 범위 및 속도의 균형이 필요합니다. 고정 소수점 산술은 정밀하고 적절한 속도를 제공하지만 범위를 희생합니다. 임의 정밀도 라이브러리 인 BigNum은 범위와 정밀도에서 승리하지만 속도는 떨어집니다.

문제의 핵심은 대부분의 과학 및 공학 계산에는 고속 및 광범위한 범위가 필요하지만 정밀도에 대한 요구는 상대적으로 적다는 것입니다. 가장 잘 결정된 물리 상수는 약 13 자리로만 알려져 있으며, 많은 값은 훨씬 덜 확실하게 알려져 있습니다. 컴퓨터에서 13 자리 이상의 정밀도를 갖는 것은 도움이되지 않습니다. 연고의 비행은 부동 소수점 연산 시퀀스가 ​​점차 정밀도를 잃을 수 있다는 것입니다. 수치 분석의 빵과 버터는 어떤 문제가 이것에 특히 민감한 지 알아 내고, 문제를 줄이기 위해 작업 순서를 재정렬하는 영리한 방법을 찾아냅니다.

이에 대한 예외는 수학에서 수 이론으로 수백만 자릿수이지만 절대 정밀도로 숫자에 대한 산술 연산을 수행해야합니다. 수치 이론가들은 종종 BigNum 라이브러리를 사용하며 계산에 오랜 시간이 걸렸습니다.


2
좋은 대답입니다. 기본 기능은 완벽하게 연속적 일 수 있지만 정확하게 모델링하려면 완벽한 정밀도가 필요하지만 실제로는 과학 및 엔지니어링의 모든 것이 근사치입니다. 우리는 차분하고 유용한 근사법을 가지고 무한 정확도 이상의 것을 달성 할 것입니다. 많은 연산이 끝날 때까지 영원히 기다릴 것입니다.
Jonathan Eunice

4
@JonathanEunice 현실을 정확하게 모델링 할 수는 없습니다. 모델의 입력은 측정 값에서 비롯된 것으로 현대 컴퓨터 / 소프트웨어의 실제 실수가 제한 할 정도로 정확하게 측정 할 수는 없을 것입니다. 즉, 완벽한 모델, 소프트웨어 또는 수학을 가질 수 있습니다. 그것은 중요하지 않습니다. 예 : 상자의 부피를 계산합니다. a*b*c쉬운 일이지만 절대 확실성으로는 할 수없는 치수를 측정해야하므로 측정 오차에 구속되기에 충분한 계산 정밀도는 필요하지 않습니다.
luk32

2
@ luk32 우리는 그 점들 대부분에 대해 매우 동의합니다. 어떤 것 (구의 부피 등)을 정확하게 모델링 할 수는 있지만 정확하게 측정 할 수는 없습니다. 그리고 현실은 완벽한 모델에 완벽하게 맞지 않습니다. 완벽한 측정 또는 계산을 기다리는 것보다 약간 부정확하고 유용한 값 / 모델을 얻는 것이 좋습니다.
Jonathan Eunice

2
“문제의 요점은 대부분의 과학 및 공학 계산에는 고속의 넓은 범위가 필요하다는 것입니다.”만약 내가 오랫동안 시간을 ​​주면 정확하게 계산하는 알고리즘이 널리 알려지지 않았기 때문에 여전히 정확하게 계산할 수 없습니다. 그리고 우선, 숫자를 정확하게 표현할 수도 없습니다. 이것은 우리가 빨리 또는 느리게 해결하는 방법을 모르는 문제 일뿐입니다.
Michael Le Barbier Grünewald 8

@ MichaelGrünewald, 우리는 실수를 정확하게 표현할 수 없지만 2 천 피트 높이의 구조물을 만들고 DNA에서 유전자를 식별하며 2 년 후 혜성으로 위성을 교환 할 수있을 정도로 근사치까지 문제를 해결할 수 있습니다 우주에서. 랜디 뉴먼 (Randy Newman)을 말하면, 그것은 정확하지 않을 수도 있지만, 괜찮습니다. 사실 우리는 메모리의 한계에 따라 임의의 정밀 라이브러리를 사용하여 합리적 표현을 정확하게 표현할 수 있습니다.
Charles E. Grant

30

어떤 대안 을 제안합니까?

연속 수량은 수학에서 실수를 사용하여 표현됩니다. 가능한 모든 실수를 인코딩 할 수있는 데이터 유형이 없으므로 (실제를 계산할 수 없기 때문에) 가장 관심있는 실수의 일부만 선택할 수 있습니다.

  • 컴퓨터 대수 시스템 (CAS)과 유사한 계산 가능한 모든 실수를 선택할 수 있습니다. 문제는 식 트리가 점점 커짐에 따라 빠르게 실행 불가능하다는 것입니다. Mathematica에서 거대한 미분 방정식 시스템을 상징적으로 풀고 다른 부동 소수점 기반 구현과 비교해 보면 속도의 극적인 차이를 보게 될 것입니다. 또한 Jörg W Mittag와 kasperd가 지적했듯이 평등 / 비교 작업도 결정할 수 없습니다.

  • 정확한 유리수를 사용할 수는 있지만, 제곱근이나 코사인 또는 로그 등을 계산해야하기 때문에 실제로는 많은 응용 프로그램에서 작동하지 않습니다. 그리고 더 많은 계산을 수행 할 때 처리 할 시간.

  • 임의의 정밀도 소수를 사용할 수도 있지만 무한 반복 자릿수가 있으므로 나누기처럼 간단한 것도 작동하지 않습니다. 또한 합리적인 숫자와 비슷하게 수행할수록 복잡성이 증가하는 문제가 발생할 수 있습니다.

따라서 어떤 시점에서는 근사값을 사용해야합니다.이 경우 부동 소수점 숫자가 가장 좋은 위치입니다. 부동 소수점 숫자도 고정 너비입니다 (앞서 언급 한 다른 3 가지 데이터 형식과 달리). 더 많은 계산을 수행 할 때 복잡성이 증가하는 것을 방지합니다.


1
가장 좋은 답변 중 하나는 내 글을 쓰기 전에 간과했습니다.
Michael Le Barbier Grünewald 8

8
게다가 두 계산 가능한 실수가 같은지 알 수 없다는 약간 불편한 사실이 있습니다.
Jörg W Mittag

1
계산 가능한 모든 실수를 사용하면 비교에 문제가되지 않습니까? 정지 문제를 해결하지 않으면 임의의 계산 가능한 실수를 비교할 수 없다고 확신합니다.
kasperd

@ kasperd : 계산에 사용할 수있는 연산에 따라 어느 정도의 측정에 달려 있다고 생각합니다.하지만 계산 유형 집합이 얼마나 풍부 할 수 있는지 확실하지 않으며 두 가지 임의의 결과가 발생할 수 있는지 확실하지 않습니다. 한정된 수의 작업으로 생산 된 시간을 제한 시간 내에 비교할 수 있습니다. 대수 유형은 거의 확실하게 그 기준을 충족하지만 ln (x) 및 exp (x) 함수를 추가하고 여전히 충족시킬 수 있는지 모르겠습니다.
supercat

연속 분수를 사용하여 임의의 정밀 산술 (더하기, 곱하기, 빼기, 나누기), 비합리적인 (√2와 같은), 잘 알려진 초월 (Pi 및 e와 같은), 삼각 함수 등을 지원할 수 있습니다. HAKMEM의 Gosper 알고리즘을 참조하십시오. 완료되면 지연 평가를 수행하여 부동 소수점 근사값을 원하는 정밀도로 얻을 수 있습니다.
Paul Chernoch

14

과학에 대한 당신의 제안이 잘못되었습니다. 공학과 과학 이외의 수학은 정확한 결과로 작동하지 않습니다. 그들은 당신이 보여주는 자릿수에 내장 된 정밀 인자로 작동합니다.

여기 이해하는 데 필요한 핵심 용어는 다음과 같습니다 유효 숫자 . 숫자의 유효 숫자는 정밀도에 기여하는 의미를 갖는 숫자입니다.

기본적으로 12 센티미터 길이라고 말하면 실제로 11,5에서 12,5 센티미터 사이에있을 수 있습니다. 그러나 내가 무언가가 12,00 센티미터 길이라고 말하면 그것은 11,995에서 12,005 센티미터 사이의 길이 일 수 있습니다.

예를 들어, 측정 테이프를 가지고 거실을 측정하는 경우. 너비가 6 미터에서 25 센티미터라는 것을 알 수 있지만 테이프 측정이 밀리미터 정확도 또는 나노 미터 정확도에 대해 아무 것도 말할 수있을만큼 정확하지 않다는 것을 알고 있습니다.


@leftaroundabout 수학 (수학 에서처럼)이 과학이 아니라는 것은 무엇을 의미합니까? 내 책에서 그렇습니다.
Pieter B

2
@PieterB : 수학은 과학이 아닙니다. 철학입니다. 과학은 우리의 육체 세계에 대한 이해를 형성하는 행위입니다. 철학은 아이디어가 이상적인 세상에서 어떻게 작동하는지 이해하는 행위입니다.
slebetman

나는 과학이 일반적으로 중요한 수치보다는 명시적인 신뢰 범위를 가지고 일하는 것을 선호한다고 생각합니다.
Taemyr

@slebetman 게다가 그것은 내 게시물에서 내 요점과 아무 관련이 없습니다. 수학이 과학인지 아닌지에 대해서는 인용을 내릴 수 없습니다 : 자연은 본질적으로 수학적이며, 그녀는 수학으로 우리에게 말합니다. 우리는 듣기 만하면됩니다. 자연은 수학이기 때문에 자연을 설명하려는 모든 과학은 수학에 전적으로 의존합니다. 이 점을 지나치게 강조하는 것은 불가능하며 Carl Friedrich Gauss가 수학을 "과학의 여왕"이라고 부르는 이유입니다.
Pieter B

그 인용문은 여기에서 온 것 입니다. 잘 읽고 토론하기에 충분하지만 실제로는 게시물이 나이 질문과 관련이 없으므로 여기에서는 아닙니다.
leftaroundabout

7

부동 소수점 숫자는 기본적으로 과학공학 표기법 과 동일하며 인간이 수학 및 과학에서 숫자를 쓰는 표준 방법입니다. 이 분야에서, 극단적 인 정밀도에 큰 필요가없는있다, 그러나 종종있다 거대한 범위는.

물리학 숙제에서 임의의 예를 선택하기 위해, 나는 최근에 대략 9.11 * 10 ^ -31 kg 인 전자 덩어리로 작업해야했습니다. 나는 정밀도에 관심이 없다. 내가 돌보는 모든 것에 대해 쉽게 9.12 일 수 있습니다. 그러나 지수에 관심이 있고 0.0000 ~ 911kg을 쓰지 않아도되므로 과학 표기법을 사용합니다.

과학 및 엔지니어링 컴퓨팅에도 비슷한 추론이 적용됩니다. 범위는 크지 만 매우 많은 수를 저장하고 작업 할 필요가 없으므로 정규화 된 값과 지수를 저장하여 작고 빠르게 작업 할 수 있습니다.


6

부동 소수점 숫자에는 특정 유형의 과학적 결과를 계산하는 데 적합한 여러 속성이 있습니다. 특히 과학적 표기법에서와 같이 정밀도는 크기에 반비례하기 때문에 0에 가까운 작은 차이와 훨씬 더 큰 차이를 모두 나타낼 수 있습니다.

Goldberg의 논문 은 아마도 부동 소수점 숫자의 속성에 대한 가장 유명한 분석 일 것입니다 (그리고 이런 종류의 일에 관심이 있다면 독서가 필요합니다). 그러나 Kahan의 논문 은 많은 미묘한 배경의 근거를 설명하는 데 더 잘 작동한다고 생각합니다 디자인 문제.

특히, Java의 부동 소수점 구현에 대한 Kahan의 열병은 염증이 심하지 만 IEEE-754 의미론이 유용한 이유에 대해 몇 가지 좋은 점을 제시하며, Nothing 's Nothing 's Sign Bit에 대한 Ado 는 상당한 깊이에서 부호없는 0에 대한 이론적 근거를 탐구합니다.


나는 아직 카한의 전체 논문을 읽지는 않았지만, 그는 나보다 예의 바르다. Java는 real3 개의 스택 항목을 저장하고 시스템의 고유 한 계산 정밀도를 나타내는 유형을 추가 한 경우 실제 숫자보다 더 유용하고 더 빠른 숫자를 가질 수있었습니다 . 이 값은 64 비트 float + 32 비트 패딩 또는 80 비트 float + 16 비트 패딩 또는 64 비트 가수, 16 비트 지수 및 부호 및 플래그를위한 16 비트 [FPU가 아닌 구현의 경우]로 저장 될 수 있습니다.
supercat

그 지정 float하고 double저장 형식이 있고, real계산 형식입니다. FPU가없는 많은 시스템에서 단어 및 반 단어 경계에있는 가수, 지수 및 플래그를 사용하면 모든 작업에서 압축을 풀고 재 포장하는 것보다 속도가 빠릅니다.
supercat

2

TL; DR 완벽한 정밀도로 대부분의 함수를 계산하는 방법을 모릅니다. 따라서 완벽한 정밀도로 숫자를 나타내는 점은 없습니다.

지금까지의 모든 대답은 가장 중요한 점을 놓쳤습니다. 대부분의 숫자의 정확한 값을 계산할 수 없습니다. 중요한 특별한 경우로서, 우리는 지수 함수의 정확한 값을 계산할 수 없으며, 가장 중요한 비이성 함수 만 인용합니다.

순진한 질문에 대한 순진한 답변

당신의 질문은 오히려 "정확한 산술 라이브러리가 있습니다, 왜 우리는 부동 소수점 산술 대신에 그것들을 사용하지 않습니까?"라고 대답합니다. 정확한 산술은 유리수와 그에 대해 작동한다는 것입니다.

  • 아르키메데스의 수 (페 도니아 어 이름 π)는 합리적이지 않습니다.
  • 다른 많은 중요한 상수는 합리적이지 않습니다.
  • 다른 많은 중요한 상수는 심지어 합리적이라고 알려져 있지 않습니다.
  • 0이 아닌 유리수 x에 대해 숫자 exp (x) 는 비합리적입니다.
  • 과학자들에게 중요한 급진, 대수 및 풍부한 기능 (Gauss 분포, CDF, 베셀 함수, 오일러 함수 등)에 대해서도 비슷한 내용이 있습니다.

합리적인 숫자는 운이 좋은 사고입니다. 대부분의 숫자는 합리적이지 않으므로 (Baire의 정리 참조) 숫자를 계산하면 항상 합리적인 세계에서 벗어날 수 있습니다.

계산과 숫자는 무엇입니까?

“문제는 유리수가 실수를 표현하기에 그렇게 좋은 선택이 아니라는 것입니다.”라고 말함으로써 반응 할 수 있습니다. 그런 다음 썰매 포크 데비안을 롤업하고 실수에 대한 새로운 표현 시스템을 고안합니다.

숫자를 계산하려면 실수에 대한 표현 시스템을 선택하고 중요한 연산을 기술해야 합니다. 즉, 컴퓨팅의 의미를 정의해야 합니다. 우리는 과학 계산에 관심이 있기 때문에 모든 십진수 (우리의 측정 값), 몫 (이론 수), 지수 함수 값 및 아르키메 드 수와 같은 재미있는 상수를 정확하게 표현하려고합니다.

문제는 그러한 시스템에서 숫자를 완벽하게 나타내는 유일한 방법은 상징적 인 형식을 사용하는 것, 즉 아무것도 계산하지 않고 대수적 표현으로 작업하는 것입니다. 두 숫자를 확실하게 비교할 수 없기 때문에 실수는 다소 무너집니다. 우리는“주어진 숫자가 0과 같은가?”라는 질문에 쉽게 대답 할 수 없습니다.

보다 정확한 수학적 정의와 문제를 찾으려면 예를 들어 유리수, 초월수, 근사치 및 Baire 정리를 찾으십시오.


나는 이것이 질문에 대한 대답이 아니라 위대한 답변이라고 생각합니다. 그렇기 때문에 나는 그 질문이 당신이 만들고있는 포인트를 이해할 것이라고 확신하지 않습니다. 그것과 당신은 유한 한 디지털 표현 (동적 또는 정적 비트 폭에 관계없이)으로 \ Real 또는 \ Complex 숫자를 부정확하게 표현하는 것에 상당히 익숙합니다. 그것은 전적으로 사실이지만 요점 옆에 있습니다. 대한 명예 하지 로봇-동맹 골드버그를 인용. :) 그리고 Baire의 정리는 프로그래머 나 StackOverflow에서 발견되는 일반적인 수사법의 일부가 아닙니다.
mctylr

0

때문에

1) 저자는 "엔지니어링 및 과학적 계산"이 실제 물리량을 측정한다고 가정합니다.

2) 물리량은 연속적이며, "부동 소수점 수를 사용하여 연속 량을 모델링 할 수 있습니다"라고 명시한대로

.. 그리고 나머지 답변은 Rufflewind의해 잘 요약되어 있으므로 여기서는 반복하지 않겠습니다.


0

부동 소수점 숫자는 상대적 정확도를 제공합니다.이 숫자는 광범위한 숫자에 대한 정확한 숫자와 거리가 가장 작은 (최대 0.0000000000001 %와 같은 비율로 호출하려는 경우) 숫자를 나타낼 수 있습니다. 그들은이 특성을 슬라이드 규칙과 공유하지만 후자는 3 자리의 정확도보다 나아지지 않습니다. 그럼에도 불구하고, 디지털 컴퓨터가 일반화되기 전에 대형 구조물의 정적 및 동적 힘을 해결하기에는 충분했으며, 이는 재료 상수도 약간의 변화를 나타 내기 때문에 재료 및 구조적 차이에 대해 합리적으로 양성적인 구조를 선택하기 때문입니다. 최대 하중과 약점을 합리적으로 식별 할 수 있습니다.

이제 "정확도"는 물리적 특성의 측정 및 / 또는 크기를 나타내는 많은 숫자에 유용한 기능입니다.

과학 / 엔지니어링의 모든 것이 해당 범주에 속하는 것은 아닙니다. 예를 들어, 오류 수정 다항식을 조작하기 위해 큰 숫자 나 Galois 필드를 곱하기 위해 숫자 이론적 변환을 사용하는 경우 작은 오류와 같은 것은 없습니다. 소음.

이러한 영역에서도 오류 누적을 추적하고 부동 소수점 오류가 단일 비트를 뒤집을 수있을 정도로 충분한 크기를 축적하지 않도록하는 경우 부동 소수점 숫자 (콘볼 루션을 수행하기 위해 복잡한 FFT 사용)와 같이 작업 할 수 있습니다 그들이 대략적인 실제 실체. 이러한 근사치의 경우 고정 소수점 처리가 더 적합 할 수 있지만 필드의 부동 소수점 단위는 더 빠른 연산과 더 많은 수의 사용 가능한 비트를 제공하는 경향이 있습니다.

또한 C 또는 Fortran과 같은 프로그래밍 언어는 혼합 정밀도 곱셈 및 나눗셈 또는 덧셈 / 뺄셈을위한 캐리 비트와 같은 기본 연산에 액세스하는 것을 놀라 울 정도로 어렵게 만들고 제한된 정수를 넘어서는 기본 빌딩 블록입니다.

따라서 연산을 부동 소수점 숫자로 매핑 할 수 있다면 요즘에는 상당히 강력한 하드웨어를 사용하는 경향이 있으며 오늘날의 범용 프로그래밍 언어 중 하나로 알고리즘을 적절히 지정할 수 있습니다.


0

어떤 응용 프로그램 float/ double데이터 유형이 적합하지 않은지 해결하면 이것이 대답 할 수 있다고 생각합니다 .

특정 자릿수로 숫자를 정확하게 표현할 수 있어야하는 경우 부동 소수점 숫자는 숫자를 나타내는 방법과 같이 10의 거듭 제곱 대신 2의 거듭 제곱으로 숫자를 나타내므로 부적합합니다. 현실 세계.

따라서 부동 소수점 데이터 유형을 사용하지 않아야하는 도메인 중 하나는 finance *입니다. 예를 들어 은행의 핵심 시스템의 경우, $ 100000.01이었던 금액이 갑자기 $ 100000.00 또는 $ 100000.02가되면 완전히 수용 할 수 없습니다.

이러한 문제는 플로트를 사용할 때, 특히 숫자가 하나 이상의 계산 결과 인 경우 (예 : 계정의 모든 트랜잭션 합계 계산)에 쉽게 발생할 수 있습니다.

공학 및 과학 계산은 상대적으로 작은 반올림 오류가 허용되는 영역입니다. 사용자는 일반적으로 모든 숫자의 정밀도가 제한되어 있으며 종종 여러 숫자로 작업합니다. 많은 유효 숫자로 있습니다. 그러나 가장 중요한 것은 잘 정의 된 상대 정밀도, 즉 매우 큰 숫자와 매우 작은 숫자에 대해 동일한 수의 유효 자릿수를 제공한다는 것입니다.

* 나는 floats를 사용하여 값을 나타내는 금융 응용 프로그램에서 일했으며 결과적으로 반올림 오류가 발생했습니다. 다행히도이 특정 버그는 전혀 중요하지 않았으며 사용자는 프로그램의 계산 오류에 대해 불평했습니다. 이로 인해 사용자는 시스템에 대한 믿음을 잃기 시작했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.