부동 소수점 산술

Floating-point arithmetic
초기의 전기 기계 프로그래밍 가능한 컴퓨터인 Z3에는 부동 소수점 산술이 포함되어 있었습니다(MunichDeutsches Museum에 전시된 복제품).

계산에서 부동소수점 연산(FP)은 범위와 정밀도의 균형을 지원하기 위한 근사치로서 실수의 공식 표현을 사용하여 연산된다.이러한 이유로 부동소수점 계산은 고속 처리 시간이 필요한 매우 작고 매우 큰 실수의 시스템에서 자주 사용됩니다.일반적으로 부동소수점 숫자는 대략 일정한 유효 자리수(유효 자리수)로 표현되며, 일부 고정 베이스에서는 지수를 사용하여 스케일링됩니다.스케일링의 베이스는 보통 2, 10, 또는 16입니다.정확하게 나타낼 수 있는 번호는 다음 형식입니다.

여기서 significant는 정수, base는 2 이상의 정수, exponent도 정수입니다.예를 들어 다음과 같습니다.

부동소수점이라는 용어는 숫자의 기수점(10진수점, 또는 컴퓨터에서는 이진수점)이 "부동"할 수 있다는 사실을 의미합니다. 즉, 숫자의 유효 자릿수에 상대적인 위치에 배치할 수 있습니다.이 위치는 지수에 의해 표시되므로 부동소수점 표현은 과학적 표기법의 한 형태로 생각할 수 있습니다.

부동소수점 시스템을 사용하여 크기가 다른 숫자의 숫자를 나타낼 수 있습니다.예를 들어 은하간 거리 또는 원자핵의 직경을 같은 길이의 단위로 나타낼 수 있습니다.동적 범위의 결과, 나타낼 수 있는 숫자는 균일한 간격으로 배치되지 않습니다. 연속되는 두 개의 표현 가능한 숫자의 차이는 선택한 [1]척도에 따라 달라집니다.

번호선의 단정도 부동소수점 번호: 녹색 선은 표시 가능한 값을 표시합니다.
위의 증강 버전에서는 대표 가능한 값의 두 가지 징후가 모두 표시된다.

수년간 컴퓨터에서는 다양한 부동소수점 표현이 사용되어 왔습니다.1985년에 IEEE 754 부동소수점 산술 표준이 제정되었으며 1990년대 이후 가장 일반적으로 접하는 표현은 IEEE에 의해 정의된 표현입니다.

일반적으로 FLOPS로 측정되는 부동소수점 연산 속도는 컴퓨터 시스템의 중요한 특성이며, 특히 수학적인 계산을 많이 하는 어플리케이션에서는 더욱 그렇습니다.

부동소수점 유닛(FPU, 구어로는 수학 코프로세서)은 부동소수점 숫자에 대한 연산을 수행하기 위해 특별히 설계된 컴퓨터 시스템의 일부입니다.

개요

부동 소수점 수

숫자 표현은 보통 숫자 문자열로 숫자를 인코딩하는 방법을 지정합니다.

숫자 문자열이 숫자를 나타낼 수 있는 메커니즘은 여러 가지가 있습니다.일반적인 수학 표기법에서 숫자 문자열은 임의의 길이일 수 있으며, 기수 점의 위치는 명시적인 "점" 문자(점 또는 쉼표)를 배치하여 나타냅니다.기수 포인트가 지정되지 않은 경우 문자열은 암묵적으로 정수를 나타내며 비기수 포인트는 문자열의 오른쪽 끝에서 최하위 자리 옆에 있습니다.고정 소수점 시스템에서는 문자열 내의 위치가 기수점에 대해 지정됩니다.따라서 고정 소수점 방식에서는 소수점 가운데에 소수점 8자리 문자열을 사용할 수 있습니다.여기서 "00012345"는 0001.2345를 나타냅니다.

과학적 표기법에서는 주어진 숫자는 10의 거듭제곱으로 스케일링되므로 특정 범위(일반적으로 1에서 10 사이)에 속하며 기수점은 첫 번째 자리 바로 뒤에 표시됩니다.스케일링 계수는 10의 거듭제곱으로 숫자 끝에 별도로 표시됩니다.예를 들어, 목성의 위성 Io의 공전 주기는 152,853.5047초이며, 이 값은 표준 형태의 과학적 표기법으로 1.528535047×10초로5 표현될 것입니다.

부동소수점 표현은 과학적 표기법과 개념이 유사합니다.논리적으로 부동 소수점 번호는 다음과 같이 구성됩니다.

  • 소정의 베이스(또는 기수)에서 소정의 길이의 부호 있는(양수 또는 음수를 의미) 숫자 문자열.이 숫자 문자열을 유의, 가수 또는 [nb 1]계수라고 합니다.의 길이는 숫자를 나타낼 수 있는 정밀도를 결정합니다.기수점 위치는 항상 유의한 자릿수의 바로 뒤 또는 바로 앞 또는 가장 오른쪽(최소 유의한) 자릿수의 오른쪽에 있는 것으로 가정합니다.이 문서에서는 일반적으로 기수점은 최상위(왼쪽) 자리 바로 뒤에 설정됩니다.
  • 부호 있는 정수 지수(특성 또는 [nb 2]척도라고도 함)로, 숫자의 크기를 변경합니다.

부동소수점 숫자의 값을 도출하기 위해 유의와 기수를 지수거듭제곱으로 곱합니다. 이는 기수점을 암시된 위치에서 지수의 값과 동일한 여러 자리로 이동하는 것과 같습니다. 지수가 양수이면 오른쪽으로, 지수가 음수이면 왼쪽으로 이동합니다.

예를 들어 base-10(친숙한 10진수 표기법)을 사용하면 10진수의 10진수를 가진 숫자 152,853.5047이 유의값으로, 5가 지수값으로 1528,535,047과 함께 표시됩니다.실제 값을 구하려면 유의치의 첫 번째 자리 뒤에 소수점을 배치하고 결과에 10을5 곱하여 1.528535047×105,152,853.5047을 구합니다.이러한 수를 격납할 때, 베이스(10)는 지지된 숫자의 전체 범위와 같기 때문에 격납할 필요가 없고, 따라서 유추할 수 있다.

상징적으로 이 최종값은 다음과 같습니다.

여기서 s는 유의점(암묵적인 소수점 포함), p는 정밀도(유의점 내 자리수), b는 기저점(이 예에서는 숫자 10), e는 지수입니다.

역사적으로, 몇 수 기지 부동 소수 점 숫자를 상징하는 것으로, 베이스와 함께 사용해 온 두개(2진)가장 흔한, 그 후에 기지 10(소수 점 부동 소수 점), 그리고 다른 덜 흔한 종류 등의 기본 16( 떠다니는 16진수 point[2][3][nb 3]), 기지 8( 떠 있는 8진 point[4][3][5][2][nb 4])와 베이스 4(이다Nary 떠 있는 point[6][3][nb 5])와 베이스 thr.ee(균형 3진 부동소수점[4]) 및 짝수[3][nb 6] 베이스 256 및 베이스 65,536.[7][nb 7]

부동소수점수는 하나의 정수를 다른 정수로 나누어서 나타낼 수 있기 때문에 유리수이다. 예를 들어 1.45×103 (145/100)×1000 또는 145,000/100이다.밑수는 나타낼 수 있는 분수를 결정합니다.예를 들어 1/5은 이진수 밑수를 사용하여 부동소수점 숫자로 정확하게 나타낼 수 없지만 1/5은 소수점 밑수(0.2 또는 2×10−1)를 사용하여 정확하게 나타낼 수 있습니다.그러나 1/3은 이진수(0.0101...) 또는 십진수(0.333...)로 정확하게 나타낼 수 없지만, 3진수에서는 사소한(0.1 또는−1 1×3)입니다.무한 확장이 발생하는 경우는 기저와 주요 요인에 따라 달라집니다.

유의어와 지수를 컴퓨터에 저장하는 방법은 구현에 따라 달라집니다.일반적인 IEEE 형식은 나중에 자세히 설명하지만 예를 들어 바이너리 싱글 소켓(32비트) 부동소수점 에서는 p (\ p이므로 유의는 24비트의 문자열입니다.예를 들어 숫자 '의 첫 번째 33비트는 다음과 같습니다.

이 바이너리 확장에서는 0(최좌 비트 또는 최상위 비트)부터 32(최우측 비트)까지의 위치를 나타냅니다.위의 밑줄 친 비트0으로 표시된 위치 23에서 24비트가 정지합니다.위치 24에 있는 다음 비트를 라운드 비트 또는 라운딩 비트라고 합니다.이 값은 33비트 근사치를 가장 가까운 24비트 수로 반올림하기 위해 사용됩니다(여기서는 그렇지 않습니다).이 예에서는 1인 이 비트가 맨 왼쪽의 24비트로 형성된 정수에 가산되어 다음과 같은 결과가 됩니다.

이것이 IEEE 754 인코딩을 사용하여 메모리에 저장될 경우, 이것significant 가 됩니다.significate and는 맨 왼쪽 비트의 오른쪽에 바이너리 포인트가 있다고 가정합니다.따라서 is의 2진수 표현은 다음과 같이 왼쪽에서 오른쪽으로 계산됩니다.

여기서 p는 정밀도( 예에서는 24), n은 왼쪽부터의 유의 비트 위치(0에서 시작하여 23에서 종료)이며 e는 지수( 예에서는 1)입니다.

0이 아닌 숫자의 유의 및 최상위 자릿수는 0이 아니어야 할 수 있습니다(대응하는 지수가 최소 지수보다 작을 경우 제외).이 프로세스를 정규화라고 합니다.이진 형식(숫자 0숫자 1만 사용)의 경우 0이 아닌 이 숫자는 반드시 1입니다.따라서 메모리에 표시할 필요가 없기 때문에 포맷이 1비트의 정밀도를 가질 수 있습니다.이 규칙은 선행 비트 표기법, 암묵 비트 표기법, 숨겨진 비트 [4]표기법 또는 가정 비트 표기법으로 다양하게 불립니다.

부동 소수점 번호 대체 방법

부동소수점 표현은 지금까지 컴퓨터에서 실수에 대한 근사치를 표현하는 가장 일반적인 방법입니다.단, 다음과 같은 대안이 있습니다.

  • 고정점 표현은 이진수 또는 소수점 위치에 대한 특정 규칙의 소프트웨어 구현에 의해 제어되는 정수 하드웨어 연산을 사용합니다(예: 오른쪽에서6비트 또는 숫자).이러한 표현을 조작하는 하드웨어는 부동소수점보다 비용이 적게 들고 일반 정수 연산에도 사용할 수 있습니다.이진 고정점은 보통 정수 연산만 수행할 수 있는 임베디드 프로세서의 특수 용도 응용 프로그램에서 사용되지만, 십진 고정점은 상용 응용 프로그램에서 일반적입니다.
  • 로그 수 시스템(LNS)은 절대값과 부호 비트의 대수로 실수를 나타냅니다.값 분포는 부동 소수점과 비슷하지만 값 대 표현 곡선(0 제외)은 부드럽습니다.부동소수점 산술과는 반대로 대수계 곱셈에서는 나눗셈과 뺄셈은 실행이 간단하지만 덧셈과 뺄셈은 복잡하다.Charles Clenshaw, Frank Olver 및 Peter Turner의 (대칭) 수준 지수 산술(LI 및 SLI)은 일반화 로그 표현에 기초한 체계이다.
  • 테이퍼형 부동소수점 표현.실제로는 사용되지 않는 것 같습니다.
  • 일부 단순 유리수(예: 1/3 및 1/10)는 정밀도에 관계없이 이진 부동소수로 정확하게 나타낼 수 없습니다.다른 기수를 사용하면 일부(10진수 부동 소수점에서는 1/10 등)를 나타낼 수 있지만 가능성은 여전히 제한적입니다.합리적인 계산을 수행하는 소프트웨어 패키지는 분자와 분모를 적분하여 숫자를 분수로 나타내며, 따라서 어떤 유리수라도 정확하게 나타낼 수 있습니다.이러한 패키지는 일반적으로 개별 정수에 대해 "bignum" 연산을 사용해야 합니다.
  • 구간 산술에서는 숫자를 구간으로 표현하고 결과에 대한 보장된 경계를 얻을 수 있습니다.일반적으로 다른 산술, 특히 부동 소수점에 기초합니다.
  • Mathematica, Maxima Maple과 같은 컴퓨터 대수 시스템은 종종 유의어의 특정 인코딩을 처리하지 않고 "포멀" 방식으로 3 같은 비합리적인 숫자를 처리할 수 있습니다.이러한 프로그램은 각 중간 계산에 대한 근사값을 사용하는 대신 기초 수학을 직접 처리하도록 프로그래밍되어 있기 때문에 " ( )\ \) "과 같은 식을 정확하게 평가할 수 있습니다.

역사

1914년 부동소수점 형태를 제안한 레오나르도 토레스 이 케베도

1914년 레오나르도 토레스케베도는 특수 목적의 전기 기계 계산기를 [8]위한 그의 설계를 논의하는 과정에서 부동소수점의 형태를 제안했다.1938년 베를린의 Konrad Zuse는 최초의 바이너리 프로그래머블 기계 [9]컴퓨터인 Z1을 완성했다. Z1은 7비트 부호 지수, 17비트 부호(암묵 비트 포함) 및 부호 [10]비트를 가진 24비트 이진 부동 소수점 숫자 표현을 사용한다.1941년에 완성된 보다 신뢰성 높은 릴레이 기반 Z3는 양의 무한과 음의 무한을 모두 표현합니다. 특히1 /= { } /_}과 같은 된 연산을 구현하며 0 ×"\times\"와 같은 정의되지 않은 연산에 의해 중지됩니다

22비트 이진 부동소수점 표현을 사용하는 Z3 컴퓨터 설계자 Konrad Zuse 씨

Zuse는 또한 조심스럽게 반올림된 부동 소수점 산술을 제안했지만 완료하지 않았다. 여기에는 ± \ NaN 표현이포함되어 IEEE 표준의 특징을 40년 [11]예상한다.이와는 대조적으로 폰 노이만은 고정 소수점 산술이 [11]더 바람직하다고 주장하며 1951년 IAS 기계에 대한 부동 소수점 숫자에 반대할 것을 권고했다.

부동소수점 하드웨어를 탑재한 최초의 상업용 컴퓨터는 Zuse의 Z4 컴퓨터로 1942년부터 1945년까지 설계되었다.1946년, Bell Laboraties는 10진 부동 소수점 [12]숫자를 구현한 Mark V를 도입했다.

파일럿 ACE는 바이너리 부동소수점 연산을 갖추고 있으며 1950년 영국 국립물리연구소에서 운용되기 시작했습니다.33대는 나중에 영국 전기 듀스로 상업적으로 판매되었다.이 계산은 실제로 소프트웨어로 구현되지만, 1메가헤르츠 클럭 레이트로 이 기계의 부동소수점 및 고정소수점 연산 속도는 경쟁하는 많은 컴퓨터보다 처음에는 빨랐습니다.

IBM 704는 1954년에 양산되었고, 편향된 지수의 사용을 도입했습니다.그 후 수십 년 동안 부동소수점 하드웨어는 일반적으로 옵션 기능이었고, 이를 갖춘 컴퓨터는 "과학적 컴퓨터" 또는 "과학적 계산"(SC) 기능을 갖추고 있다고 알려져 있었습니다(XSC)도 참조).1989년 인텔 i486이 출시되고 나서야 범용 PC는 하드웨어에 부동소수점 기능을 표준 탑재했습니다.

1962년에 도입된 UNIVAC 1100/2200 시리즈는 다음 2개의 부동소수점 표현을 지원했습니다.

  • 단일 정밀도: 1비트 부호, 8비트 지수 및 27비트 중요도로 구성된 36비트.
  • 2배 정밀도: 72비트로 1비트 부호, 11비트 지수 및 60비트 중요도로 구성됩니다.

1962년에 소개된 IBM 7094는 UNIVAC의 표현과는 관계 없이 단정도 및 배정도 표현을 지원했습니다.실제로, 1964년 IBM은 System/360 메인프레임에 16진수 부동 소수점 표현을 도입했습니다. 이러한 표현은 현재도 최신 z/Architecture 시스템에서 사용할 수 있습니다.1998년 IBM은 메인프레임에 IEEE 호환 이진 부동 소수점 산술을 구현했으며 2005년에는 IEEE 호환 10진 부동 소수점 산술도 추가했습니다.

처음에 컴퓨터는 부동 소수점 숫자에 대해 많은 다른 표현을 사용했습니다.메인프레임 레벨에서의 표준화 부족은 1970년대 초까지 상위 레벨의 소스 코드를 작성하고 유지하는 업체들에게 지속적인 문제였습니다. 이러한 제조업체 부동 소수점 표준은 단어 크기, 표현, 반올림 동작 및 운영의 일반적인 정확도에서 차이가 있었습니다.여러 컴퓨팅 시스템 간의 부동소수점 호환성은 1980년대 초까지 표준화가 절실히 필요했고, 32비트(또는 64비트) 단어가 보편화되자 IEEE 754 표준이 만들어졌습니다.이 표준은 i8087 수치 코프로세서를 설계하고 있던 인텔의 제안에 크게 기초하고 있습니다.동시에 68000을 설계하고 있던 모토로라도, 상당한 의견을 주었습니다.

1989년 수학자이자 컴퓨터 과학자인 윌리엄 카한은 이 제안의 배후에 있는 주요 건축가로 튜링상을 수상했습니다; 그는 그의 제자(제롬 쿠넨)와 초빙 교수(해럴드 스톤)[13]의 도움을 받았습니다.

x86의 혁신은 다음과 같습니다.

  • 비트 문자열 수준에서 정확하게 지정된 부동 소수점 표현. 따라서 모든 호환 컴퓨터가 비트 패턴을 동일하게 해석합니다.이를 통해 (엔디안성을 고려한 후) 한 컴퓨터에서 다른 컴퓨터로 부동소수점 번호를 정확하고 효율적으로 전송할 수 있습니다.
  • 산술 연산에 대해 정확하게 지정된 동작:결과는 무한정 정확한 산술을 사용하여 특정 규칙에 따라 반올림된 값을 산출한 것처럼 생성되어야 합니다.이것은 컴퓨터 프로그램이 특정 입력이 주어졌을 때 항상 같은 결과를 낳는다는 것을 의미하며, 따라서 부동소수점 연산이 지금까지 비결정적인 행동을 위해 개발한 거의 신비로운 평판을 완화한다.
  • 예외적인 조건(오버플로우, 0으로 나누기 등)이 정상적인 방법으로 계산을 통해 전파된 후 소프트웨어에 의해 제어된 방식으로 처리되는 능력.

부동 소수점 번호의 범위

부동소수점 번호는 2개의 고정소수점 컴포넌트로 구성됩니다.이 컴포넌트의 범위는 그 표현에 포함되는 비트수 또는 자리수에 의해서만 결정됩니다.구성요소는 선형적으로 범위에 의존하는 반면 부동소수점 범위는 유의 범위와 지수 구성요소의 범위에 선형적으로 의존합니다. 지수 구성요소는 매우 넓은 범위를 숫자에 부착합니다.

일반적인 컴퓨터 시스템에서 2진수(64비트)의 부동소수점 수는 53비트(1개의 암묵 비트 포함), 11비트의 지수 및 1개의 부호 비트의 계수를 가진다.2 = 1024이므로10, 이 형식의 양의 정규 부동 소수점 숫자의 전체 범위는−10221024 2 × 2−308 × 10 ~ 약 2 × 2 × 10입니다308.

시스템(B, P, L, U)의 정규화된 부동 소수점 번호의 수.

  • B는 시스템의 기반입니다.
  • P는 유의값의 정밀도(베이스 B)입니다.
  • L은 계의 가장 작은 지수이다.
  • U는 계의 가장 큰 지수이다.

는 2( -) ( -) ( - +) ( \ 2 \ ( B - 1 \ right ) \ ( B^ { P - 1 \ ) \ ( - L +1 \ right )}

최소 양의 정규화된 부동 소수점 숫자가 있습니다.

언더플로 레벨 = UFL = {\ B

이 값은 선행 자릿수로 1을 사용하고 유효수의 나머지 자릿수로 0을 사용하며 가능한 한 지수의 최소 값을 가집니다.

가장 큰 부동 소수점 숫자가 있습니다.

오버플로 레벨 = OFL ( - -) ( U +) \ style \ ( 1 - B^ { - } \ ) \left ( { + 1 } \ ,

이 값은 유의값의 각 자릿수에 대한 값으로 B - 1을 가지며 지수의 가능한 최대값을 갖습니다.

또한 -UFL과 UFL 사이에는 엄밀하게 표현 가능한 값, 즉 양의 0과 음의 0, 탈정규화된 숫자있습니다.

IEEE 754: 최신 컴퓨터의 부동소수점

IEEE는 IEEE 754(일명, 2진수 부동소수점)의 컴퓨터 표현을 표준화했습니다.1985년 IEC 60559).이 첫 번째 표준은 거의 모든 현대식 기계들에 의해 지켜지고 있습니다.그것은 2008년에 개정되었다.IBM 메인프레임은 IEEE 754 바이너리 형식과 더불어 IBM 고유의 16진 부동 소수점 형식 및 IEEE 754-2008 부동 소수점지원합니다.Cray T90 시리즈는 IEEE 버전을 사용했지만 SV1은 여전히 Cray 부동소수점 [citation needed]형식을 사용합니다.

이 규격은 몇 가지 세부 사항만 다를 뿐 밀접하게 관련된 많은 형식을 제공한다.이러한 형식 중 5가지를 기본 형식이라고 하며, 다른 형식을 확장 정밀도 형식 및 확장 정밀도 형식이라고 합니다.컴퓨터 하드웨어 및 [citation needed]언어에서는 특히 다음 세 가지 형식이 널리 사용됩니다.

  • 단일 정밀도(이진수32) 보통 C 언어 패밀리의 "플로트" 유형을 나타내는 데 사용됩니다.이것은 32비트(4바이트)를 차지하는 바이너리 형식이며, 24비트(약 10진수 7자리)의 정밀도를 가집니다.
  • 이중 정밀도(이진수64) 보통 C 언어 패밀리의 "이중" 유형을 나타내는 데 사용됩니다.이것은 64비트(8바이트)를 차지하는 바이너리 포맷으로, 53비트(약 16자리)의 정밀도를 가지고 있습니다.
  • 이중 확장, 모호하게 "확장 정밀도" 형식이라고도 합니다.이는 최소 79비트(숨김/암시 비트규칙이 사용되지 않는 경우 80)를 점유하는 바이너리 형식이며, 그 중요도는 최소 64비트(약 19자리)입니다.C 언어군의 C99C11 표준은 부속서 F("IEC 60559 부동 소수점 산술")에서 " 더블"[14]로 제공하는 것을 권장한다.최소 요건(64비트 중요도 및 정밀도, 15비트 지수, 따라서 80비트에 적합)을 충족하는 형식이 x86 아키텍처에 의해 제공됩니다.이러한 프로세서에서는, MSVC 에서는 확장 정밀도를 이용할 수 없지만, 이 포맷은 「롱 더블」로 사용할 수 있는 경우가 많습니다.정렬을 위해 많은 도구에서 이 80비트 값을 96비트 또는 128비트 [15][16]공간에 저장합니다.다른 프로세서에서는 "long double"은 4배의 [17]정밀도와 같은 더 큰 형식을 의미할 수 있으며, 확장된 정밀도를 사용할 [18]수 없는 경우에는 2배의 정밀도를 의미합니다.

부동소수점 표현의 정밀도를 높이면 일반적으로 중간 [19]계산에 의해 발생하는 누적 반올림 오차의 양을 줄일 수 있습니다.일반적인 IEEE 형식은 다음과 같습니다.

  • 4배 정밀도(2진수 128).이것은 128비트(16바이트)를 차지하는 바이너리 포맷으로 113비트(10진수 약 34자리)의 정밀도를 가지고 있습니다.
  • Decimal64Decimal128 부동소수점 형식.이러한 형식은 decimal32 형식과 함께 십진 반올림을 올바르게 수행하기 위한 것입니다.
  • 16비트 부동소수점 값인 binary16이라고도 불리는 하프 정밀도.NVIDIA Cg 그래픽스 언어 및 OpenEXR [20]표준으로 사용되고 있습니다.

절대값이 2 미만인24 정수는 단정도 형식으로 정확하게 나타낼 수 있으며, 절대값이 2 미만인53 정수는 단정도 형식으로 정확하게 나타낼 수 있습니다.또, 그 수의 2배의 광범위한 거듭제곱을 나타낼 수 있다.이러한 속성은 순수 정수 데이터에 사용되는 경우가 있습니다.이러한 속성은 배정도 플로트가 있지만 32비트 정수밖에 없는 플랫폼에서 53비트 정수를 취득할 수 없습니다.

표준에는 몇 가지 특수값과 그 표현이 지정되어 있습니다.양수 무한대(+ (-), 음수 무한대(-"), 일반("양수") 0과 구별되는 음수 0 및 "숫자가 아닌" 값(NaNs)입니다.

IEEE 표준에서 정의된 부동 소수점 숫자의 비교는 일반적인 정수 비교와는 조금 다릅니다.음의 제로와 양의 제로 비교는 같고, 모든 NaN은 자신을 포함한 모든 값과 동등하지 않습니다.모든 유한 부동소수점 숫자는 +'보다 작고 -'보다 큽니다.또, 그 값과 같은 순서로 정렬됩니다(실수 세트).

내부 대표

부동소수점 숫자는 일반적으로 컴퓨터 데이터에 부호 비트, 지수 필드 및 유의 또는 가수로서 왼쪽에서 오른쪽으로 채워집니다.기존의 하드웨어 실장이 있는 IEEE 754 바이너리 포맷(basic 및 extended)의 경우는, 다음과 같이 할당됩니다.

유형 서명하다 지수 [ Significant and 필드 총 비트 수 지수 바이어스 비트 정밀도 소수 자릿수
절반 (IEEE 754-2008) 1 5 10 16 15 11 ~3.3
싱글 1 8 23 32 127 24 ~7.2
이중 1 11 52 64 1023 53 ~15.9
x86 정밀도 향상 1 15 64 80 16383 64 ~19.2
쿼드 1 15 112 128 16383 113 ~34.0

지수는 양수 또는 음수일 수 있지만 이진 형식에서는 고정된 "바이어스"가 추가된 부호 없는 숫자로 저장됩니다.이 필드의 모든 0 값은 0 및 하위 정규 번호용으로 예약되며, 모든 1 값은 인피니티 및 NaN용으로 예약됩니다.정규화된 숫자의 지수 범위는 단일 정밀도의 경우 [-126, 127], 이중의 경우 [-1022, 1023], 쿼드의 경우 [-16382, 16383]입니다.정규화된 수치에는 정규 이하의 값, 0, 무한 및 NaN이 제외됩니다.

IEEE 바이너리 교환 포맷에서는 정규화된 유의의 선두 1비트가 실제로 컴퓨터 데이텀에 저장되지 않습니다.이것은 "숨김" 또는 "암시적" 비트라고 불립니다.따라서 단정도 포맷은 실제로 24비트의 정밀도를 가지며, 이중정도 포맷은 53, 쿼드는 113을 가집니다.

예를 들어, 24비트의 정밀도로 반올림된 θ는 다음과 같은 값을 가지고 있습니다.

  • 부호 = 0 ; e = 1 ; s = 1100100001111011(숨김 비트 포함)

지수 바이어스(127)와 지수(1)의 합은 128이므로 이는 다음과 같이 단정도 형식으로 표현된다.

  • 010000100001111011 (숨김 비트 제외)= 4049016진수로서 FDB를[21] 지정합니다.

32비트 부동소수점 레이아웃의 예는 다음과 같습니다.

Float example.svg

64비트 레이아웃도 비슷합니다.

특별한 값

부호 0

IEEE 754 표준에서는 0이 서명되어 있습니다.즉, 「양수 제로」(+0)와 「음수 제로」(-0)가 모두 존재하는 것을 의미합니다.대부분의 런타임 환경에서 양의 0은 보통 다음과 같이 인쇄됩니다.0그리고 음수 0은 "으로 한다.-0". 두 값은 수치 비교에서는 동일하게 동작하지만 일부 연산은 +0과 -0에 대해 다른 결과를 반환합니다.예를 들어, 1/(-0)는 음의 무한대를 반환하는 반면 1/+0은 양의 무한대를 반환합니다(따라서 등식 1/(1/±diag) = ±diag가 유지됩니다).x=0에서 불연속성을 갖는 다른 공통 함수로는 로그(x), 부호(x), 음수 y에 대한 y + xi의 주 제곱근 등이 있습니다.모든 근사 체계와 마찬가지로 "음수 0"을 포함하는 연산은 때때로 혼란을 일으킬 수 있습니다.예를 들어 IEEE 754에서 x = y 0 = -0이지만 1/0 always 1/-0처럼 항상 1/x =[22] 1/y의미하는 것은 아닙니다.

미정규격

하위 정규 값은 언더플로 갭 바로 바깥에 있는 인접 값과 절대 거리가 동일한 값으로 언더플로 갭을 채웁니다.이는 언더플로 갭이 0으로 되어 있는 기존 관행보다 개선되었으며, 언더플로 결과가 0으로 대체되었습니다(플러쉬에서 [4]0으로).

현대의 부동소수점 하드웨어에서는 통상 이하의 값(일반값과 마찬가지로)이 처리되며, 통상 이하의 값에 대해서는 소프트웨어 에뮬레이션이 필요 없습니다.

무한대

확장실수선의 무한은 1, 1.5 등의 일반적인 부동소수점 값과 마찬가지로 IEEE 부동소수점 데이터 타입으로 나타낼 수 있습니다.오버플로우 발생 시 대체 값으로 사용되는 경우가 많지만 오류 값은 아닙니다.0으로 나누기 예외에서는 양의 무한대 또는 음의 무한대가 정확한 결과로 반환됩니다.무한대는 숫자(C의 "INFINITY" 매크로, 프로그래밍 언어가 해당 구문을 허용하는 경우 """)로도 도입할 수 있습니다.

IEEE 754 에서는, 다음과 같은 방법으로 무한을 처리할 필요가 있습니다.

  • (+∞) + (+7) = (+∞)
  • (+∞) × (−2) = (−∞)
  • (+140) × 0 = NaN – 의미 있는 작업이 없습니다.

NaNs

IEEE 754 에서는, 0/0, 「×0」, 또는 sqrt(-1)등의 특정의 「무효」한 연산의 결과로서 반환되는 「Not a Number」(NaN)라고 하는 특수한 값을 지정합니다.일반적으로 NaN은 전파된다. 즉, 주어진 부동 소수점 값에 대해 정의된 결과를 제공하는 함수는 NaN에 대해서도 NaN ^ 0 = 1이다.NaN에는 디폴트 Quiet NaN과 시그널링 NaN의 2종류가 있습니다.임의의 산술 연산(숫자 비교 포함)에서 시그널링 NaN이 발생하면 "비활성 연산" 예외가 시그널링됩니다.

표준으로 지정된 NaN의 표현에는 에러의 종류 또는 발생원을 부호화하기 위해 사용할 수 있는 미지정 비트가 몇 개 있습니다만, 그 부호화에 관한 규격은 없습니다.이론적으로 시그널링 NaN은 런타임시스템에 의해 미초기화 변수에 플래그를 붙이거나 일반적인 값으로 연산을 늦추지 않고 부동소수점 숫자를 확장하기 위해 사용될 수 있습니다.다만, 그러한 확장은 일반적이지 않습니다.

IEEE 754 설계 근거

윌리엄 카한.인텔 80x87 부동소수점 코프로세서와 IEEE 754 부동소수점 표준의 프라이머리 아키텍처.

확장 형식, NaN, 무한, 하위 정규 등과 같이 여기서 논의되는 IEEE 754 표준의 보다 난해한 특징이 수치 분석가 또는 고급 수치 적용에만 관심이 있다는 것은 일반적인 오해이다.사실 그 반대입니다.이러한 기능은, 전문가가 고도의 수치 라이브러리를 서포트할 뿐만 아니라, 수치적으로 세련된 프로그래머에게 안전하고 견고한 디폴트를 제공하도록 설계되어 있습니다.IEEE 754의 주요 설계자인 William Kahan은 "..."는 잘못된 표현이라고 지적합니다.이진 부동 소수점 산술용 IEEE 표준 754의 [deem] 기능:[]는 수치 전문가만이 사용할 수 있는 기능이라는 평가를 받고 있다.사실은 정반대이다.1977년, 이러한 기능은 가능한 한 폭넓은 시장에 대응할 수 있도록 인텔 8087에 설계되었습니다.오류 분석은 IEEE 표준 754와 같이 프로그래머의 선의의 무지에 적당히 견딜 수 있는 부동소수점 산술 설계 방법을 알려 줍니다."[23]

  • infinity 및 NaN 등의 특수한 값에 의해 부동소수점 연산이 대수적으로 완전해집니다.모든 부동소수점 연산은 명확하게 정의된 결과를 생성하며 기본적으로는 머신의 인터럽트나 트랩을 발생시키지 않습니다.더욱이, 예외적인 경우에 반환되는 특수값의 선택은 많은 경우에 정답을 제공하도록 설계되었다.예를 들어 IEEE 754 산술에서 R(z) := 7 - 3/[z - 2 - 1/(z - 7) + 10/[z - 2 - 2/(z - 3)]와 같은 연속 분수는 전위를 0으로 나누기 때문에 모든 입력에 대한 정답을 제공하므로, 예를 들어 z = 3에 대해서는 안전하게 [24]무시될 수 있다.Kahan이 지적한 바와 같이 Ariane 5 로켓의 손실을 초래한 부동 소수점부터16비트 정수 변환 오버플로우는 디폴트 IEEE 754 부동 소수점 [23]정책에서는 발생하지 않습니다.
  • 정규 이하의 숫자를 사용하면 유한 부동 소수점 숫자 x 및 y의 경우 x - y = y인 경우에만 x - y = 0이 되지만 이전의 부동 소수점 [13]표현에서는 유지되지 않습니다.
  • x87 80비트 포맷의 설계 근거에 대해 Kahan은 다음과 같이 말합니다.이 확장 포맷은 플로트 오퍼랜드와 더블 오퍼랜드를 제외한 모든 간단한 산술에 사용할 수 있도록 설계되어 있습니다.예를 들어 다항식 평가, 스칼라 곱, 부분 및 연속 분수와 같은 반복을 구현하는 루프의 스크래치 변수에 사용해야 한다.이는 종종 단순한 알고리즘을 망칠 수 있는 조기 오버/언더플로우 또는 심각한 로컬 취소를 방지합니다."[25]중간 결과를 높은 정밀도와 확장된 지수로 확장된 형식으로 계산하는 것은 과학적 계산의 역사적 관행과 과학적 계산기의 설계에서 전례가 있다.Hewlett-Packard의 재무 계산기는 그들이 저장하거나 표시하는 것보다 3개의 [25]중요한 소수점까지 산술과 재무 함수를 수행했다.확장 정밀도의 구현으로 표준 기본 기능 라이브러리를 쉽게 개발할 수 있었으며, 일반적으로 고속으로 최종 위치(ULP)의 한 단위 내에서 두 배의 정밀도 결과를 얻을 수 있었다.
  • 값을 가장 가까운 대표값으로 반올림하면 계산 시 체계적인 편중이 방지되고 오류의 증가가 느려집니다.동점을 반올림하면 유사한 수치를 추가할 때 발생할 수 있는 통계적 편향도 제거됩니다.
  • 방향 반올림은 예를 들어 구간 산술에서 오차 한계를 확인하는 데 도움이 되도록 고안되었습니다.또한 일부 기능의 구현에도 사용됩니다.
  • 연산, 특히 올바른 반올림 연산의 수학적 기초를 통해 수학적 특성을 증명하고 2Sum, Fast2SumKahan SUM 알고리즘과 같은 부동 소수점 알고리즘을 설계하여 정확도를 향상시키거나 다중 정밀도 산술 서브루틴을 비교적 쉽게 구현할 수 있습니다.

단일 정밀도 및 이중 정밀도 형식의 속성은 부호화가 부동소수점 하드웨어를 사용하지 않고도 쉽게 정렬할 수 있다는 것입니다.2의 보완 정수로 해석되는 비트는 이미 양수를 올바르게 정렬하고 음수를 반대로 합니다.xor를 사용하여 부호 비트를 양의 값으로 플립하고 모든 비트를 음의 값으로 플립하면 모든 값이 부호 없는 정수(-0 < +0)[26]로 정렬됩니다.이 재산이 의도된 것인지는 불분명하다.

기타 주목할 만한 부동 소수점 형식

널리 사용되는 IEEE 754 표준 포맷 외에 특정 도메인 고유의 영역에서 다른 부동 소수점 포맷이 사용되고 있거나 사용되고 있습니다.

  • Microsoft 바이너리 포맷(MBF)은 Microsoft의 첫 제품인 Altair BASIC(1975), TRS-80 LEVEL II, CP/MMBASIC, IBM PC 5150BASA, MS-DOSGW-Quick 등 Microsoft BASIC 언어 제품용으로 개발되었습니다.버전 4.00보다 이전 ASICQuickBASIC 버전 4.00 및 4.50은 IEEE 754-1985 형식으로 전환되지만 /MBF 명령어옵션을 사용하여 MBF 형식으로 되돌릴 수 있습니다.MBF는 MITS Altair 8800용으로 1975년 봄 빌 게이츠의 기숙사 동료인 Monte Davidoff에 의해 시뮬레이션된 Intel 8080으로 설계 및 개발되었습니다.1975년 7월의 초기 릴리스는 MITS Altair 8800 4킬로바이트 메모리 비용 때문에 단정도(32비트) 포맷을 지원했습니다.1975년 12월 8킬로바이트 버전은 2배 정밀도(64비트) 포맷을 추가했습니다.MOS 6502(Apple //, Commodore PET, Atari), Motorola 6800(MITS Altair 680), Motorola 6809(TRS-80 컬러 컴퓨터) 등 다른 CPU에는 단정도(40비트) 변형 형식이 채택되었습니다.1975년부터 1987년까지 모든 Microsoft 언어 제품은 Microsoft Binary Format을 사용했습니다.Microsoft는 1988년부터 최신 릴리스까지 모든 제품에 IEEE-754 표준 포맷을 채택했습니다.MBF는 MBF 단정도 형식(32비트, '6자리 BASIC'),[27][28] MBF 확장정도 형식(40비트, '9자리 BASIC')[28] 및 MBF 배정도 형식(64비트)[27][29]으로 구성됩니다.각각 8비트 지수 뒤에 각각 55비트 및 23비트, 31비트 순으로 표시됩니다.
  • Bfloat16 포맷에서는 IEEE 754 하프 정밀도 포맷과 같은 양의 메모리(16비트)가 필요하지만 5가 아닌 8비트를 지수에 할당하므로 IEEE 754 싱글 정밀도 수치와 같은 범위가 제공됩니다.trailing significand 필드가 10비트에서7비트로 감소하기 때문에 트레이드오프는 정밀도가 낮아집니다.이 형식은 정밀도보다 범위가 더 중요한 기계 학습 모델의 훈련에 주로 사용됩니다.많은 머신 러닝 액셀러레이터가 이 포맷을 하드웨어로 지원하고 있습니다.
  • Tensor Float-32[30] 포맷은 Bfloat16의 8비트의 지수와 10비트의 후행 유효 및 필드의 반정밀 포맷을 조합하여 19비트의 사이즈가 됩니다.이 포맷은 Nvidia Ampere 아키텍처를 기반으로 GPU의 텐서 코어에서 하드웨어 지원을 제공하는 Nvidia에 의해 도입되었습니다.이 형식의 단점은 크기가 2의 거듭제곱이 아니라는 것입니다.단, Nvidia에 따르면 이 형식은 하드웨어에서 연산 속도를 높이기 위해 내부적으로만 사용해야 하며 입력 및 출력은 32비트 단정도 IEEE 754 [30]형식으로 저장해야 합니다.
  • Hopper 아키텍처 GPU는 2개의 FP8 포맷을 제공합니다.하나는 반정밀(E5M2)과 같은 수치 범위(E5M2)이고 다른 하나는 정밀도가 높지만 범위가 작은(E4M3)[31]입니다.
IEEE 754 반정밀 및 단정밀 표준 포맷과 비교하여 Bfloat16, Tensor Float-32 및 2개의 FP8 포맷 사양
유형 서명하다 지수 Trailing significant 및 필드 총 비트 수
FP8(E4M3) 1 4 3 8
FP8(E5M2) 1 5 2 8
반정밀 1 5 10 16
Bfloat16 1 8 7 16
텐서플로트-32 1 8 10 19
단정도 1 8 23 32

대표수, 변환 및 반올림

그 성질상 부동소수점 형식으로 표현되는 모든 숫자는 해당 베이스의 끝 확장을 갖는 유리수(예를 들어 base-10의 끝 소수점 확장이나 base-2의 끝 이진수 확장)θ 또는 θ2와 같은 무리수나 비종단 유리수는 근사치를 구해야 한다.정밀도의 자리수(또는 비트수)는 정확하게 나타낼 수 있는 유리수의 집합도 제한합니다.예를 들어, 소수점 123456789는 8자리 정밀도만 사용할 수 있는 경우 정확하게 나타낼 수 없습니다( 개의 교차 표현 가능한 값인 12345678 × 101 또는 12345679 × 101 중 하나로 반올림됨). 이는 0.5555555로 반올림되는 비종단 자리(.5)에도 동일하게 적용됩니다.

컴퓨터 구현에서 지원되지 않는 네이티브 부동소수점 표현이 아닌 어떤 형식(문자열 등)으로 숫자가 표현될 경우 해당 구현에서 사용하기 전에 변환이 필요합니다.숫자가 부동소수점 형식으로 정확하게 표현될 수 있는 경우 변환은 정확합니다.정확한 표현이 없는 경우 변환에서는 원래 값을 나타내기 위해 사용할 부동 소수점 번호를 선택해야 합니다.선택한 표현은 원본과 다른 값을 가지며, 이렇게 조정된 값을 반올림 값이라고 합니다.

합리적인 숫자에 끝 확장이 있는지 여부는 기준값에 따라 달라집니다.예를 들어, base-10에서는, 숫자 1/2는 종단 확장(0.5)을 가지는 반면, 숫자 1/3은 종단 확장(0.333...)을 가지지 않습니다.base-2에서는 분모가 2의 거듭제곱인 유리수(예: 1/2 또는 3/16)만 끝납니다.분모가 2가 아닌 소인수를 갖는 모든 유리수는 무한 이항 팽창을 가질 것이다.즉, 10진 형식으로 쓰면 짧고 정확한 것으로 보이는 숫자는 이진 부동소수로 변환할 때 근사치를 구해야 할 수 있습니다.예를 들어, 10진수 0.1은 한정된 정밀도의 2진수 부동소수점에서는 나타낼 수 없습니다.정확한 2진수 표현은 "1100" 시퀀스가 끝없이 계속됩니다.

e = -4; s = 1100110011001100110011001100110011...,

앞에서 설명한 바와 같이 s유의값이고 e는 지수입니다.

24비트로 반올림하면

e = -4; s = 110011001100110011001101,

이 값은 실제로는 0.1400001490116119384765625입니다.

또 다른 예로, 비트의 무한 시퀀스로 2진수로 표현되는 실수 θ는 다음과 같습니다.

11.0010010000111111011010101000100010000101101000110000100011010011...

하지만

11.0010010000111111011011

24비트의 정밀도로 반올림하여 근사치를 구합니다.

이진 단일 소수점 부동 소수점에서는 s = 1.100100001111011, e = 1표시됩니다.이 값은 10진수 값입니다.

3.1415927410125732421875,

반면 θ의 실제 값의 보다 정확한 근사치는

3.141592658979323846264338327950...

반올림 결과는 실제 값과 약 0.03ppm 차이가 나며 처음 7자리의 소수점 표현 in과 일치합니다.차이점이산 오류이며 기계 엡실론에 의해 제한됩니다.

같은 지수를 가진 2개의 연속된 부동소수점 숫자의 산술적 차이를 Unit in the last place(ULP; 마지막 자리 단위)라고 부릅니다.예를 들어 대표번호 1.45a70c22와hex 1.45a70c24hex 사이에 대표번호가 없는 경우 ULP는 2×16−8 또는−31 2입니다.base-2 지수 부분이 0인 수, 즉 절대값이 1보다 크거나 같고 2보다 작은 수의 경우, ULP는 단정도에서는 정확히−23 2 또는−7 약 10이며, 2배정도에서는 정확히−53 2 또는 약 10이다−16.IEEE 준거 하드웨어의 필수 동작은 결과가 ULP의 1/2 이내라는 것입니다.

반올림 모드

반올림은 부동소수점 연산(또는 부동소수점 형식으로 변환)의 정확한 결과가 유의값의 자리수보다 많은 자리수를 필요로 하는 경우에 사용됩니다.IEEE 754에서는 정확한 반올림이 필요합니다.즉, 반올림된 결과는 값을 계산하기 위해 무한정 정확한 산술이 사용된 후 반올림된 것과 같습니다(실장에서는 이를 보증하기 위해 3비트만 더 필요합니다).여러 가지 다른 반올림 방식(또는 반올림 모드)이 있습니다.역사적으로, 절단은 전형적인 접근법이었다.IEEE 754의 도입 이후, 디폴트 방법(가장 가까운 것에 반올림, 짝수와의 관계, 때로는 뱅커 반올림)이 보다 일반적으로 사용되고 있습니다.이 방법은 산술 연산의 이상적인(무한 정밀도) 결과를 가장 가까운 대표값으로 반올림하여 [nb 8]그 결과로 표현합니다.동점일 경우 유의와 종료가 짝수 자릿수로 되는 값이 선택됩니다.IEEE 754 표준은 숫자(비 NaN) 결과가 있을 때 제곱근과 변환을 포함한 모든 기본 대수 연산에 동일한 반올림을 적용해야 한다.즉, IEEE 754 동작의 결과는 NaN의 표현을 제외한 모든 비트에서 완전히 결정된다는 것입니다.("cosine이나 log 등의 라이브러리" 함수는 필수가 아닙니다.)

다른 반올림 옵션도 사용할 수 있습니다.IEEE 754 는, 다음의 반올림 모드를 지정합니다.

  • 가장 가까운 위치에 있는 가장 가까운 짝수 자리(기본값 및 지금까지 가장 일반적인 모드)로 묶는 반올림합니다.
  • round to nearst. 여기서 ties는 0에서 반올림됩니다(바이너리 부동 소수점에서는 임의이며 일반적으로 10진수로 사용됩니다).
  • 반올림(반올림+반올림)
  • 반올림(반올림, 마이너스 결과 0에서 반올림)
  • 0을 향해 반올림(논의. -3.9를 -3으로, 3.9를 -3으로 변환하는 플로트-투-스위치 변환의 일반적인 동작과 유사합니다.

대체 모드는 유입되는 오류의 양을 제한해야 할 때 유용합니다.제한 오류가 필요한 응용 프로그램은 다중 정밀도 부동 소수점 및 간격 산술입니다.대체 반올림 모드는 수치 불안정 진단에도 유용합니다. 서브루틴의 결과가 +와 - 무한대 사이에서 상당히 다를 경우, 수치적으로 불안정하고 반올림 [32]오차의 영향을 받을 수 있습니다.

최소 자릿수로 이진에서 10진수로 변환

2진수 부동소수점 숫자를 10진수 문자열로 변환하는 것은 일반적인 작업이지만, 정확하고 최소한의 결과를 내는 알고리즘은 Steel과 White의 Dragon4에서 1990년까지 인쇄되지 않았습니다.그 이후의 개선점에는 다음과 같은 것들이 있습니다.

  • 데이비드 M.Gay's dtoa.c는 Dragon4에서 많은 아이디어를 실용적으로 구현한 오픈 소스입니다.[33]
  • Grisu3, Bignum을 사용하지 않기 때문에 속도가 4배 향상되었습니다.~[34]0.5%의 경우에 실패하므로 폴백과 함께 사용해야 합니다.
  • Errol3는 Grisu3와 비슷하지만 그보다 느립니다.보아하니 폴백이 [35]있는 조기 종말의 그리수만큼은 아닌 것 같아.
  • Ryu는 Grisu3보다 빠르고 심플한 상시 성공 알고리즘입니다.[36]

많은 현대 언어 런타임에서 Grisu3와 Dragon4 폴백을 [37]사용합니다.

10진수에서 2진수로 변환

10진수 문자열을 2진수 FP 표현으로 해석하는 문제는 복잡하며 정확한 파서는 Clinger의 1990년 작업(dtoa.[33]c에서 구현)까지 나타나지 않습니다.더 빠른 [38]파싱으로 더 많은 작업이 진행되었습니다.

부동 소수점 연산

표시와 이해를 용이하게 하기 위해 IEEE 754 decimal32 형식과 같이 7자리 정밀도의 10진 기수를 사용합니다.기본 원리는 정규화가 선택 사항이라는 점(결과 수치에는 영향을 주지 않음)을 제외하고 기수 또는 정밀도에서 동일합니다.여기서 s는 유의점을 나타내고 e는 지수를 나타낸다.

덧셈과 뺄셈

부동소수점 수를 추가하는 간단한 방법은 먼저 같은 지수로 부동소수점 수를 표현하는 것입니다.다음 예제에서는 두 번째 숫자가 세 자리 오른쪽으로 이동하고, 그 다음 하나는 일반적인 덧셈 방식으로 진행됩니다.

123456.7 = 1.234567 × 10^5   101.7654 = 1.017654 × 10^2 = 0.001017654 × 10^5
따라서 123456.7 + 101.7654 = (1.234567 × 10^5) + (1.017654 × 10^2) = (1.234567 × 10.001017654 × 10^5) = (1.234567 + 0.001017654) × 10^5454 × 10^5454 × 10^54)이다.

상세:

e=5; s=1.234567(123456.7) + e=2; s=1.017654(101.7654)
e=5; s=1.234567 + e=5; s=0.001017654(이동 후), e=5; s=1.235584654(참합: 123558.4654)

이것이 피연산자의 정확한 합인 진정한 결과입니다.이 값은 7자리로 반올림한 후 필요에 따라 정규화됩니다.최종 결과는

e=5; s=1.235585 (최종 합계: 123558.5)

두 번째 오퍼랜드(654)의 하위 세 자리 숫자는 기본적으로 손실됩니다.이것은 반올림 에러입니다.극단적인 경우에는 0이 아닌 두 숫자의 합계가 다음 중 하나와 같을 수 있습니다.

e=5; s=1.234567 + e=-3; s=9.876543
e=5; s=1.234567 + e=5; s=0.00000009876543(이동 후) ------------------------------- e=5; s=1.23456709876543(참합) e=5; s=1.234567(반올림 및 정규화 후)

위의 개념 예에서 추가 손가락과 많은 수의 가산기에 의해 정확한 라운딩을 보장하기 위해 제공되지만, 이진 덧셈이나 뺄셈은 피연산자의 정확도를 지나칠 필요가 있는 세심한 실행 기법은 가드 비트, 반올림하고 한가지 추가적인 끈끈한 비트를 사용하는 것들에 필요한 될 겁니다.[22][39]:218–220

유의성 손실의 또 다른 문제는 거의 동일한 두 숫자에 대한 근사치를 뺄 때 발생합니다.다음 예제에서는 e = 5; s = 1.234571 e = 5; s = 1.234567은 유리수 123457.1467 및 123456.659에 대한 근사치입니다.

e=5; s=1.234571 - e=5; s=1.234567 -------------e=5; s=0.000004 e=-1; s=4.000000(반올림 및 정규화 후)

부동소수점 차이는 숫자가 가깝기 때문에 정확하게 계산됩니다.Sterbenz lema점진적인 언더플로우가 지원되는 언더플로우인 경우에도 이를 보증합니다.그럼에도 불구하고 원래 숫자의 차이는 e = -1; s = 4.877000으로, e = -1; s = 4.0000의 근사치와 20% 이상 차이가 납니다.극단적인 경우에는 모든 유효 자릿수의 [22][40]정밀도가 손실될 수 있습니다.취소는 계산된 결과의 모든 자릿수가 의미가 있다고 가정할 때의 위험을 나타냅니다.이러한 오류의 결과에 대한 대처는 수치 분석의 주제입니다. 정확도 문제도 참조하십시오.

곱셈과 나눗셈

곱하기 위해 지수를 더하는 동안 유의치를 곱하고 결과를 반올림 및 정규화한다.

e=3; s=4.734612 × e=5; s=5.417242 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

마찬가지로, 나눗셈은 배당의 지수에서 제수의 지수를 빼고, 배당의 유의와 제수의 유의로 나눕니다.

연속적으로 작업을 [22]수행함에 따라 작은 오차가 누적될 수 있지만 곱셈이나 나눗셈에 따른 취소 또는 흡수 문제는 없습니다.실제로 디지털 로직에서 이러한 연산이 수행되는 방법은 매우 복잡할 수 있습니다(Booth의 곱셈 알고리즘나눗셈 [nb 9]알고리즘 참조).빠르고 간단한 방법은 Horner 방법을 참조하십시오.

리터럴 구문

부동 소수점 숫자의 리터럴은 언어에 따라 달라집니다.일반적으로 과학적 표기법을 나타내기 위해 또는 를 사용합니다.C 프로그래밍 언어 및 IEEE 754 표준에서는 10이 아닌 base-2 지수를 사용하여 16진수 리터럴 구문을 정의합니다.C와 같은 언어에서는 소수점 지수가 생략되면 소수점과 정수를 구별하기 위해 소수점이 필요합니다.다른 언어에는 정수형(JavaScript 등)이 없거나 숫자형(Haskell 등)의 오버로드를 허용합니다.이 경우 다음과 같은 숫자 문자열이 사용됩니다.123부동소수점 리터럴일 수도 있습니다.

부동 소수점 리터럴의 예는 다음과 같습니다.

  • 99.9
  • -5000.12
  • 6.02e23
  • -3e-45
  • 0x1.fffffep+127C 및 IEEE 754에서

예외적인 경우의 대처

컴퓨터의 부동소수점 계산에는 다음 세 가지 문제가 발생할 수 있습니다.

  • 연산은 수학적으로 정의되지 않을 수 있습니다(예: //,, 0으로 나눗셈).
  • 연산은 원칙적으로 합법적일 수 있지만 -1의 제곱근 계산이나 2의 역사인 계산과 같은 특정 형식에서는 지원되지 않습니다(둘 다 복소수가 됩니다).
  • 연산은 원칙적으로 합법적일 수 있지만 지수가 너무 크거나 작아서 지수 필드에서 인코딩할 수 없기 때문에 지정된 형식으로 결과를 나타낼 수 없습니다.이러한 이벤트를 오버플로(비용이 너무 큼), 언더플로(비용이 너무 작음) 또는 디노멀라이제이션(정밀 손실)이라고 합니다.

IEEE 표준 이전에는 이러한 조건 때문에 프로그램이 종료되거나 프로그래머가 포착할 수 있는 일종의 트랩이 트리거되었습니다.어떻게 동작하는지는 시스템에 따라 다르며 부동소수점 프로그램은 이식할 수 없습니다.(IEEE 754에서 사용되는 '예외'라는 용어는 예외적인 조건을 의미하는 일반적인 용어로 반드시 에러는 아니며, C++나 Java와 같은 프로그래밍 언어에서 일반적으로 정의되는 용도와는 다릅니다.여기서 '예외'는 IEEE 754 용어에서 '트랩'이라고 불리는 대체 제어 흐름입니다.)

여기서는 IEEE 754에 따른 예외를 처리하는 필수 기본 방법에 대해 설명합니다(IEE 754 옵션트래핑 및 기타 "대체 예외 처리" 모드는 설명하지 않습니다).산술 예외는 기본적으로 "스틱" 상태 플래그 비트에 기록해야 합니다."고정"이라는 것은 다음(산술) 연산에 의해 재설정되지 않고 명시적으로 재설정될 때까지 설정된 상태를 유지한다는 것을 의미합니다.따라서 "sticky" 플래그를 사용하면 예외 조건의 테스트가 완전한 부동 소수점 표현 또는 서브루틴 이후에 지연될 수 있습니다.플래그가 없으면 무시할 수 없는 예외 조건은 모든 부동 소수점 연산 직후에 명시적인 테스트가 필요합니다.기본적으로 연산은 항상 계산을 중단하지 않고 사양에 따라 결과를 반환합니다.예를 들어 1/0은 +"를 반환함과 동시에 Divide-by-zero 플래그 비트를 설정합니다(이 디폴트의 「」는, 후속의 조작으로 사용했을 때에 한정된 결과를 반환하는 경우가 많기 때문에, 안전하게 무시하도록 설계되어 있습니다).

다만, 원래의 IEEE 754 규격에서는, 그러한 산술 예외 플래그 비트 세트를 처리하기 위한 조작을 추천하지 못했습니다.따라서 하드웨어에 구현되어 있는 반면, 초기 프로그래밍 언어 구현에서는 일반적으로 (어셈블러와는 별도로) 액세스할 수 있는 수단이 제공되지 않았습니다.시간이 지남에 따라 일부 프로그래밍 언어 표준(: C99/C11 및 Fortran)이 상태 플래그 비트에 액세스하고 변경하는 방법을 지정하도록 업데이트되었습니다.IEEE 754 표준의 2008 버전에서는, 산술 플래그 비트에의 액세스와 처리에 관한 몇개의 조작이 지정되어 있습니다.프로그래밍 모델은 단일 스레드의 실행에 기초하고 있으며, 여러 스레드에 의한 이러한 사용은 표준 이외의 방법으로 처리되어야 합니다(예를 들어 C11은 플래그가 스레드 로컬 스토리지를 갖는 것을 지정합니다).

IEEE 754는 상태 플래그("스틱 비트")에 기록되는 5가지 산술 예외를 지정합니다.

  • 부정확, 반올림된(및 반환된) 값이 수학적으로 정확한 연산 결과와 다른 경우 설정됩니다.
  • 언더플로우: 반올림된 값이 작고(IEEE 754에서 규정되어 있음), 부정확한 경우(또는 IEEE 754의 1984 버전에 따라 디노멀라이제이션 손실이 있는 경우에 한정됨), 0을 포함한 정규 이하의 값을 반환합니다.
  • overflow: 반올림된 값의 절대값이 너무 커서 나타낼 수 없는 경우 설정됩니다.사용되는 반올림에 따라 무한대 또는 최대 유한값이 반환됩니다.
  • 0으로 나누기 - 결과가 무한인 경우 설정됩니다. 유한 오퍼랜드가 지정된 경우 +syslog 또는 -syslog 중 하나로 무한대를 반환합니다.
  • invalid, 예를 들어 sqrt(-1) 또는 0/0과 같이 실제 값 결과를 반환할 수 없는 경우 설정되며, NaN을 반환합니다.
그림 1: 병렬 저항, 전체 t {tot {}}

각 예외에 대한 기본 반환 값은 대부분의 경우 올바른 결과를 제공하도록 설계되어 있으므로 대부분의 코드에서 예외를 무시할 수 있습니다.inact는 올바르게 반올림된 결과를 반환하고 언더플로우는 거의 항상 디노멀라이즈된 [41]작은 값을 반환하므로 거의 항상 무시할 수 있습니다.dived-by-zero는 무한대를 정확하게 반환하며, 무한대는 일반적으로 유한수를 나눗셈하여 0을 부여하거나 그렇지 않은 경우 비활성 예외를 부여하므로 일반적으로 무시할 수 있습니다.예를 들어 병렬로 n개의 저항(그림 1 참조)의 유효 저항은 R / ( / + / 2 + + / ) { R _ { \ { } / ( 1 / R _ } + / R 2 + + 1 / { 1 / { N )로 나타낸다.1/(는) +infinity를 반환하고, t({tot})는 예상대로[42] 0이 됩니다(다른 예는 IEEE 754 설계 근거의 연속 부분 예 참조).

오버플로우 및 비활성 예외는 일반적으로 무시할 수 없지만 반드시 오류를 나타내는 것은 아닙니다.를 들어 루트 검색 루틴은 일반적인 동작의 일부로서 도메인 외부의 값으로 전달된 함수를 평가하고 NaN을 반환하며 유효한 시작점을 [41]찾을 때까지 무시해야 할 비활성 예외 플래그를 반환할 수 있습니다.

정확도 문제

부동 소수점 숫자가 모든 실수를 정확하게 나타낼 수 없고 부동 소수점 연산이 실제 산술 연산을 정확하게 나타낼 수 없다는 사실은 많은 놀라운 상황을 초래합니다.이것은 컴퓨터가 일반적으로 숫자를 나타내는 유한한 정밀도와 관련이 있습니다.

예를 들어 0.1과 0.01(이진수)의 비표현성은 0.1의 제곱을 시도한 결과 0.01이 되거나 0.1에 가장 가까운 수치도 되지 않음을 의미합니다.24비트(단일 정밀도) 표현에서 0.1(표준)은 이전에 = -4로 지정되었습니다. = 110011001100110011001101은 다음과 같습니다.

정확히 0.1490116119384765625 입니다.

이 숫자를 제곱하면

정확히 0.0100000002980232260973991742503180847263336181640625.

단정도 부동소수점 하드웨어(반올림 포함)로 스쿼징하면

정확히 0.0100000007078051567077671875.

하지만 0.01에 가장 가까운 대표적인 숫자는

정확히 0.0099999776482582092285156250 입니다.

또한 θ(및 θ/2)의 비대표성(및 θ/2)은 tan(tan)의 연산을 시도해도 무한의 결과가 나오지 않으며 일반적인 부동소수점 형식(tan의 정확한 구현이라고 가정)에서도 오버플로우하지 않음을 의미한다.표준 부동소수점 하드웨어에서는 tan(θ/2)을 정확하게 나타낼 수 없기 때문에 tan(θ/2)을 계산하려고 할 수 없습니다.다음 계산은 C:

/* 정확한 근사치를 얻을 수 있을 만큼 충분한 숫자입니다.*/ 이중으로 하다 파이 = 3.1415926535897932384626433832795; 이중으로 하다 z = 햇볕에 그을 띠다(파이/2.0); 

는 16331239353195370.0의 결과를 나타냅니다.단일 정밀도(사용:tanf함수)의 결과는 -22877332.0이 됩니다.

마찬가지로 sin(θ)의 연산을 시도해도 0이 되지 않는다.결과는 (배정밀의 경우) 0.1225×10−15 또는 [nb 10]단정밀의 경우 -0.8742×10이−7 됩니다.

부동 소수점 덧셈과 곱셈은 모두 가환(+a = + 및 × = ×)이지만 반드시 연관성이 있는 것은 아닙니다.,a (+) +는 반드시 b+ (+)와 같을 필요는 없습니다.7자리 소수점 산술 사용:

a = 1234.567, b = 45.67834, c = 0.0004
(a + b) + c: 1234.567 (a) + 45.67834 (b) ______1280.24534 반올림
1280.245 (a + b) + 0.0004 (c) ________1280.2454 라운드에서 1280.245 ← (a + b) + c
a + (b + c): 45.67834 (b) + 0.0004 (c) __________45.67874
1234.567 (a) + 45.67874 (b + c) ________1280.24574는 1280.246으로 반올림 ← a + (b + c)

그것들은 또한 반드시 분포적인 것은 아니다.,a ( + ) ×는 × + ×와 같을 수 없습니다.

1234.567 × 3.333333 = 4115.223 1.23567 × 3.333333 = 4.115223 4115.223 + 4.115223 = 4119.338 그러나 1234.567 + 1.234567 = 1235.1203 × 3.3333 = 411919191919197.206.

유의성 상실, θ 및 0.1과 같은 수치를 정확하게 표현할 수 없음 및 기타 약간의 부정확성 외에도 다음과 같은 현상이 발생할 수 있습니다.

  • 취소: 거의 동일한 피연산자를 빼면 [43][40]정확도가 극단적으로 떨어질 수 있습니다.거의 같은 두 숫자를 빼면 가장 유의한 자릿수가 0으로 설정되고 중요하지 않은 [4]: 124 자릿수만 남습니다.예를 들어 함수의 도함수를 결정할 때 다음 공식을 사용한다.

    직관적으로 0에 매우 가까운 값을 원하지만 부동 소수점 연산을 사용할 경우 가장 작은 숫자는 도함수의 최선의 근사치를 제공하지 않습니다.( + )와 (a )의 a차이는 작아지기 때문에 가장 유의하고 가장 오차가 적은 자릿수는 상쇄되고 가장 오차가 큰 자릿수는 더욱 중요해집니다.그 결과, 가능한 가장 작은 수의 도함수가 다소 큰 수보다 더 잘못된 도함수 근사치를 제공할 수 있다.이것은 아마도 가장 흔하고 심각한 정확도 문제일 것입니다.
  • 정수로의 변환은 직관적이지 않습니다.(63.0/9.0)을 정수로 변환하면 7이 되지만(0.63/0.09)을 변환하면 6이 됩니다.이는 변환이 일반적으로 반올림보다는 잘리기 때문입니다.바닥 천장 함수는 직관적으로 예상되는 값에서 1개씩 벗어난 답을 생성할 수 있습니다.
  • 제한된 지수 범위: 결과가 오버플로하여 무한대를 생성하거나 언더플로우가 정규 이하의 숫자 또는 0을 생성할 수 있습니다.이 경우 정밀도가 손실됩니다.
  • 안전 구분 테스트는 문제가 있습니다.제수가 0이 아님을 확인해도 나눗셈이 오버플로하지 않음을 보장하지 않습니다.
  • 동등성을 테스트하는 것은 문제가 있다.수학적으로 동일한 두 개의 계산 시퀀스는 다른 부동 소수점 [44]값을 생성할 수 있습니다.

사고

기계 정밀도 및 역오류 분석

기계 정밀도는 부동소수점 시스템의 정밀도를 나타내는 양으로 부동소수점 알고리즘의 역오류 해석에 사용됩니다.단위 반올림 또는 기계 엡실론이라고도 합니다.일반적으로 이 값은 사용되는 특정 반올림에 따라 달라집니다.

0으로 반올림하면

반면 가장 가까운 곳으로 반올림합니다.
여기서 B는 시스템의 베이스이고 P는 (베이스 B의) 유의도의 정밀도입니다.

이는 부동소수점 시스템의 정규화된 범위 내에서 0이 아닌 임의의 실수의 상대 오차를 제한하기 때문에 중요합니다.

역오류 분석, 이 이론은 제임스 H에 의해 개발되고 대중화되었습니다. Wilkinson은 수치 함수를 구현하는 알고리즘이 수치적으로 [46]안정적이라는 것을 입증하는 데 사용될 수 있습니다.기본적인 접근방식은 반올림 오류로 인해 계산된 결과가 정확히 정확하지는 않지만 약간 교란된 입력 데이터로 가까운 문제에 대한 정확한 해결책임을 보여주는 것이다.필요한 교란이 작은 경우 입력 데이터의 불확실성 순서로 결과는 데이터가 "예비"하는 만큼 정확하다.그 후 알고리즘은 역방향 안정으로 정의됩니다.안정성은 주어진 수치 절차의 반올림 오류에 대한 민감도의 척도이다. 반면, 주어진 문제에 대한 함수의 조건 번호는 입력의 작은 섭동에 대한 함수의 고유한 민감도를 나타내며 문제를 [47]해결하기 위해 사용되는 구현과는 독립적이다.

간단한 예로서 (길이 2) x {\ xy {\ y의 내부 곱을 나타내는 간단한 식을 생각해 보십시오.

그래서

어디에

어디에

정의상 약간 교란된 두 개의 입력 데이터(δ의 순서로mach)의 합이므로 역방향으로 안정적입니다.수치 선형 대수의 보다 현실적인 예는 Higham[48] 2002와 아래의 다른 참고 문헌을 참조하십시오.

정확도 문제의 영향 최소화

앞서 기술한 바와 같이 IEEE 754의 개별 연산은 ULP의 절반 이내로 정확성이 보장되지만, 보다 복잡한 공식은 반올림으로 인해 더 큰 오류가 발생할 수 있습니다.문제나 데이터가 잘못된 조건일 경우 정확성의 손실은 상당할 수 있습니다. 즉, 올바른 결과는 데이터의 미세한 섭동에 과민하게 반응합니다.그러나 그 데이터에 대해 수치적으로 불안정한 알고리즘을 사용하면 조건이 잘 갖춰진 함수라도 정확도가 크게 저하될 수 있습니다.프로그래밍 언어로 표현식의 등가성이 현저하게 다를 수 있습니다.이러한 정확성 상실의 위험을 제거하는 한 가지 방법은 수치적으로 안정적인 알고리즘의 설계와 분석이며, 수치 분석으로 알려진 수학 분과 목표이다.중간(스크래치)가치관을 알고리즘에 혹은 magnitude,[50] 이러한 위험의 명령을 줄이다 제거할 수 있는 최종 결과 requires,[49]:IEEE7544배 정도 연장되고 정밀 이 purpo 위해 계획된 것보다 더 높은 정밀도에서 수치 청의의 위험에서 보호할 수 있는 또 다른 접근법은 계산.의심할 때2배의 [51][nb 11]정밀도로 컴퓨팅을 실행할 수 있습니다.

예를 들어,x 다음 알고리즘은 함수 ()[nb 12] =x (-1)x / (exp11) - 1)를 계산하기 위한 직접적인 구현이지만, 1.0에 [23]가깝게 계산될 때 수치적으로 불안정하고 산술에 의해 전달되는 유효 자릿수의 절반까지 손실되는 것으로 나타날 수 있습니다.

이중으로 하다 A(이중으로 하다 X) {         이중으로 하다 Y, Z;  // [1]         Y = X - 1.0;         Z = exp(Y);         한다면 (Z != 1.0)                 Z = Y / (Z - 1.0); // [2]         돌아가다 Z; } 

그러나 중간 계산이 모두 확장된 정밀도로 수행되는 경우(예를 들어 [1] 라인을 C99로 설정함) long double)는 최종 이중 결과에서 최대 [nb 13]정밀도를 유지할 수 있습니다.또는 알고리즘의 수치 분석을 통해 [2] 라인에 다음과 같이 명백하지 않은 변화가 있을 경우 다음과 같이 나타납니다.

Z = 로그.(Z) / (Z - 1.0); 

그러면 알고리즘이 수치적으로 안정되어 최대 2배의 정밀도로 계산할 수 있습니다.

이러한 수치적으로 안정된 프로그램의 속성을 유지하기 위해서는 컴파일러에 의한 신중한 처리가 필요합니다.컴파일러가 실시하는 특정의 「최적화」(예를 들면, 조작의 순서 변경 등)는, 정상적으로 동작하는 소프트웨어의 목적에 어긋날 가능성이 있습니다.이 영역에서 컴파일러 및 언어 설계의 장애에 대해서는 몇 가지 논란이 있습니다.C99는 수치 정밀도를 유지하기 위해 이러한 최적화를 신중하게 지정한 언어의 예입니다.이 문서 하단의 외부 참조 자료를 참조하십시오.

고품질 부동소수점 소프트웨어를 작성하는 방법에 대한 자세한 설명은 이 문서의 범위를 벗어나며, 이 문서의 하단에서 독자와 기타 참고 자료를 [48][52]참조합니다.Kahan은 보다 신중한 수치 분석 외에 또는 그 대신에 수치 이상 위험의 크기를 상당히[52] 줄일 수 있는 몇 가지 경험 규칙을 제시한다.여기에는 위에서 설명한 바와 같이 모든 식과 중간 결과를 하드웨어에서 지원되는 최고 정밀도로 계산합니다(일반적인 경험의 법칙은 원하는 결과의 2배의 정밀도로 계산, 즉 최종 단정도 결과를 위해 2배의 정밀도로 계산, 최대 2배의 정밀도 해상도를 위해 2배의 확장 또는 4배의 정밀도로 계산함).Lts[24]. 그리고 정밀에 대한 입력 데이터와 결과를 구속하여 지원되는 입력 데이터에서 요구하게 입력 데이터를 기반으로 필요한 잘못될 수가 있는 차원을 넘어 최종 결과에서 과다 정밀도를 증가 저장 비용과, 그리고 과도한 비트:[53]notabl 수치 절차의 통합에 영향을 미칠 수 있속도 감소한다.y, f아래에 제시된 반복 예의 irst 형식은 이 경험 규칙을 사용할 때 올바르게 수렴된다.)그 외의 몇개의 문제와 테크닉에 대해 간단하게 설명합니다.

십진수 분수는 종종 2진수 부동소수로 정확하게 표현될 수 없기 때문에, 그러한 산술은 단순히 광범위한 스케일(토성 주위의 달의 궤도 주기 또는 양성자의 질량과 같은)에 걸쳐 실제 세계의 양을 측정하기 위해 사용될 때 가장 좋고, 그리고 그것이 q의 상호작용을 모델링할 것으로 예상되는 최악의 경우이다.정확할 [50][52]것으로 예상되는 10진수 문자열로 표현되는 uantity.후자의 예로는 재무적 계산이 있다.이러한 이유로 금융 소프트웨어는 이진 부동 [54]소수점 숫자 표현을 사용하지 않는 경향이 있다.C# Python 프로그래밍 언어의 "10진수" 데이터 유형과 IEEE 754-2008 표준의 10진수 형식은 사람이 입력한 정확한 10진수 값에 적용할 때 이진 부동소수점 표현의 문제를 방지하고 10진수로 숫자가 인쇄될 때 산술이 항상 예상대로 작동하도록 설계되었습니다.

부동소수점 연산 분야에서는 수학에 대한 기대가 실현되지 않을 수 있다.예를 들어 ( - ) - 2- ^{2이며 2 + 2 1 \ \2} {\} + cos = {으로 알려져 있습니다..

동등성 검정의 사용(if (x==y) ...)는 부동소수점수를 취급할 때 주의가 필요합니다.이런 간단한 표현도0.6/0.2-3==0대부분의[55] 컴퓨터에서는 true가 되지 않습니다(예를 들어 IEEE 754의 2배 정밀도에서는,0.6/0.2 - 3는, 약 -4.16889209850063e-16)와 같습니다.따라서 이러한 테스트는 때때로 "퍼지(fuzzy)" 비교로 대체된다.if (abs(x-y) < epsilon) ...단, 엡실론은 충분히 작고 1.0E-13)와 같은 애플리케이션에 맞게 조정됩니다.이 방법의 지혜는 매우 다양하며 엡실론을 [48]결합하기 위해서는 수치 분석이 필요할 수 있습니다.1차 데이터 표현과 그 비교에서 도출된 값은 반올림 오류로 [52]인한 이러한 불일치의 위험을 최소화하기 위해 보다 광범위하고 확장된 정밀도로 수행되어야 한다.이러한 테스트가 불필요하도록 코드를 구성하는 것이 더 좋은 경우가 많습니다.를 들어 계산기하학에서는 적응 정밀도 또는 정확한 산술 [56]방법을 사용하여 점이 다른 점에 의해 정의된 선이나 평면에 있는지 여부에 대한 정확한 테스트를 수행할 수 있습니다.

수학 알고리즘이 연산을 엄청나게 많이 수행하면 부동 소수점 산술의 작은 오차가 커질 수 있습니다. 가지 예로는 행렬 반전, 고유 벡터 계산, 미분 방정식 풀이 등이 있습니다.이러한 알고리즘은 잘 [57]작동하려면 반복적인 정교화와 같은 수치적 접근방식을 사용하여 매우 신중하게 설계되어야 한다.

부동소수점 값 벡터의 합계는 과학 컴퓨팅의 기본 알고리즘이기 때문에 유의성 상실이 발생할 수 있는 시점을 인식하는 것이 중요합니다.예를 들어, 매우 많은 수의 숫자를 더하는 경우 개별 덧셈은 합계에 비해 매우 작습니다.이는 중요성의 상실로 이어질 수 있습니다.일반적인 추가는 다음과 같습니다.

3253.671 +  3.141276 ----------- 3256.812

추가값의 하위 3자리는 사실상 소실됩니다.예를 들어, 모두 대략 3과 같은 숫자를 많이 추가해야 한다고 가정합니다.그 중 1000을 더하면 실행 합계는 약 3000이 됩니다.손실된 자릿수는 회복되지 않습니다.오류를 줄이기 위해 Kahan summary 알고리즘을 사용할 수 있습니다.[48]

반올림 오차는 반복 수치 절차의 수렴 및 정확도에 영향을 미칠 수 있습니다.를 들어, 아르키메데스는 6각형을 시작으로 원을 그 안에 새기고 둘러싸는 다각형들의 둘레를 계산하여 변의 수를 순차적으로 두 배로 하여 θ에 근사하였다.위에서 설명한 바와 같이 계산은 수학적으로 동등하지만 오류가 발생하기 쉬운 방식으로 재배치할 수 있습니다(수치 분석).외접 폴리곤에 대한 두 가지 형태의 반복 공식은 다음과 같습니다.[citation needed]

  • 첫 번째 형태: + ( + -) / { t _ { + } = param \ { _ { i }^{2} + 1 / { t { } }
  • 두 번째 형식: i + / ( + + }={
  • × i × i \^{ t_i}), i i (\i\\infty합니다.

다음은 IEEE "double"(중요하고 정밀도가 53비트) 산술을 사용한 계산입니다.

나는 62i×ti, 1학년 6× 2i×ti, 두번째 형태-------------------------------------------------------03.4641016151377543863 3.4641016151377543863 13.2153903091734710173 3.2153903091734723496 23.1596599420974940120 3.1596599420975006733 33.1460862151314012979 3.1460862151314352708 43.1427145996453 ×.136334 3.1427145996459225 5.1418730499801259536 3.1418730499798241950 6.1416627470548084133 3.14166274705684473 3.141617657805905 3.141610660990660660619506195061950.9885 11 3.1415927256228504127 3.1415927220386148377 12 3.14159267174125 3.14159267019992125 13 3.1415926189011454728 3.1415926717412514695939333302 3.1415926536061913 18 3.14159267174128593 3.14159265728836 19 3.141547378810956 3.1415265265908393901 20 3.143400840630615960560560516865836 19.995552 24 3.22452435345525443 3.14159265897968907 25 3.14159265897962246 26 3.14159265897962246 27 3.141592659962246 28 3.14152655357962246 참 값 314652652646은 314652652652658962246입니다. 

두 형태의 반복 공식은 수학적으로 분명히 [nb 14]동일하지만, 첫 번째 공식은 1에 매우 가까운 숫자에서 1을 빼기 때문에 유의한 자릿수의 손실이 점점 더 문제가 됩니다.반복을 반복할수록 처음에는 정확도가 높아지지만 나중에는 악화된다.53비트 산술은 약 16자리 정밀도를 지원하지만 약 8자리보다 나아지지 않습니다.반복의 두 번째 형식을 사용하면 값이 15자리 정밀도로 수렴됩니다.

'빠른 계산"

일반적으로 부동소수점 연산의 연관성이 결여되어 있기 때문에 컴파일러는 정수 및 고정소수점 연산만큼 효율적으로 산술식을 재정렬할 수 없기 때문에 공통 서브표현 제거자동벡터화 [58]의 최적화에 장애가 됩니다.많은 컴파일러(ICC, GCC, Clang, MSVC...)의 "고속 연산" 옵션은 NaN의 부족 및 IEEE 754의 무한수와 같은 안전하지 않은 가정과 함께 재연관을 활성화합니다.일부 컴파일러는 재어소시에이션만 유효하게 하는 보다 세밀한 옵션도 제공합니다.어느 경우든 프로그래머는 "빠른" [59]계산을 사용하여 프로그램의 일부에 대해 위에서 언급한 많은 정밀 함정에 노출됩니다.

일부 컴파일러(GCC 및 Clang)에서는, 기동시에 「고속」연산을 유효하게 하면, 프로그램이 정규 이하의 플로트를 무효로 해, 생성된 코드 뿐만이 아니라,[60] 라이브러리와 같은 코드를 사용하는 프로그램의 부동 소수점 동작에 영향을 주는 일이 있습니다.

ISO/IEC 1539-1:2004 Fortran 표준에서 허용된 대부분의 Fortran 컴파일러에서 재연관은 기본이며, "보호 패런" 설정(기본값으로도 켜짐)에 의해 파손이 대부분 방지됩니다.이 설정에 의해 컴파일러가 [61]괄호 경계를 넘어 재관련지을 수 없게 됩니다.인텔(R) Fortran 컴파일러는 주목할 만한 [62]특이치입니다.

"빠른" 수학의 일반적인 문제는 하위 식이 여러 곳에서 동일하게 최적화되지 않아 예기치 않은 차이가 발생할 수 있다는 것입니다.이 문제에 대한 한 가지 해석은 구현된 "빠른" 수학이 현재 제대로 정의되지 않은 의미를 가지고 있다는 것입니다."빠른" 연산 최적화를 공식화하기 위한 한 가지 시도는 검증된 [63]컴파일러인 Iceing에서 확인할 수 있습니다.

「 」를 참조해 주세요.

메모들

  1. ^ 부동소수점 숫자의 유의도는 일부 저자에 의해 가수라고도 불리며, 로그의 가수와 혼동되지 않는다.다소 모호하지만 계수나 인수와 같은 용어들도 일부 사람들에 의해 사용된다.일부 저자가 분율이라는 용어를 사용하는 것도 오해를 불러일으킬 수 있다.특성이라는 용어는 (: CDC에서 사용됨) 역사적으로 부동 소수점 숫자의 지수 형식을 지정하는 데에도 사용되었기 때문에 모호하다.
  2. ^ 부동소수점 숫자의 지수는 스케일이라고도 합니다.특성(편향된 지수, 지수 편향 또는 초과 n 표현)이라는 용어는 역사적으로 부동 소수점 숫자의 유의도를 지정하는 데도 사용되었기 때문에 모호합니다.
  3. ^ IBM System 360(1964) 370(1970)만 아니라 다양한 최신 IBM 기계, Manchester MU5(1972) 및 HEP(1982) 컴퓨터에서 16진수 부동 소수점 산술이 사용됩니다.일리노이 ILIAC III(1966년), Data General Eclipse S/200(1974년 경), Gould Powernode 9080(1980년대), Interdata 8/32(1970년대), SEL Systems 85 및 86, SDS 시그마 5(1967년), 7(1966년) 및 Xerox Sigma(1970년 경)에도 사용된다.
  4. ^ 옥탈(base-8) 부동소수점 연산은 Ferranti Atlas(1962), Burroughs B5500(1964), Burroughs B5700(1971), Burroughs B6700(1971) 및 Burroughs B7700(1972) 컴퓨터에서 사용됩니다.
  5. ^ 4차 부동소수점 연산은 일리노이 ILIAC II(1962) 컴퓨터에서 사용됩니다.또한 Digital Field System DFS IV 및 V 고해상도 사이트 조사 시스템에도 사용됩니다.
  6. ^ Base-256 부동소수점 연산은 Rice Institute R1 컴퓨터(1958년 이후)에서 사용됩니다.
  7. ^ Base-65536 부동소수점 연산은 MANIAC II(1956) 컴퓨터에서 사용됩니다.
  8. ^ 컴퓨터 하드웨어가 반드시 정확한 값을 계산하는 것은 아닙니다. 무한정 정확한 결과를 계산한 것처럼 동등한 반올림 결과를 생성하기만 하면 됩니다.
  9. ^ 현대 나눗셈 알고리즘의 엄청난 복잡성은 한때 유명한 오류로 이어졌다.인텔 Pentium 칩의 초기 버전은 드물게 약간 잘못된 결과가 나오는 분할 명령과 함께 출고되었습니다.에러가 발견되기 전에, 많은 컴퓨터가 출하되고 있습니다.결함이 있는 컴퓨터를 교체할 때까지 장애가 발생하지 않도록 패치된 버전의 컴파일러가 개발되었습니다.Pentium FDIV 버그를 참조해 주세요.
  10. ^ 그러나 cos())의 연산을 시도하면 정확히 -1이 됩니다.도함수는 θ 부근에서 거의 0이므로 인수의 부정확성에 의한 영향은 -1 주위의 부동소수점수 간격보다 훨씬 작아 반올림 결과가 정확하다.
  11. ^ William Kahan은 다음과 같이 말합니다.「매우 드문 상황을 제외하고, 초정밀 계산은 일반적으로, 유능한 에러 분석가의 가격보다 훨씬 적은 비용으로 반올림으로 인한 리스크를 경감합니다.」
  12. ^ 함수의 Taylor 확장은 A(x) = 1 - (x-1)/2 + (x-1)^2/12 - (x-1)^4/120 + (x-1)^6/30240 - (x-1)^8/12000 + ...근처에 양호한 조건을 갖추고 있음을 보여준다.x-1 < π 。
  13. ^ 2배가 IEEE 4배 정밀도경우 완전 2배 정밀도가 유지되고 긴 2배가 IEEE 2배 확장 정밀도일 경우 완전 정밀도는 유지되지만 완전 정밀도는 유지되지 않습니다.
  14. ^ 두 형태의 등가는 두 번째 형태의 분모가 첫 번째 형태의 분자켤레임을 주목함으로써 대수적으로 검증될 수 있다.첫 번째 식에 이 켤레를 곱하면 두 번째 식을 얻을 수 있다.

레퍼런스

  1. ^ W. Smith, Steven (1997). "Chapter 28, Fixed versus Floating Point". The Scientist and Engineer's Guide to Digital Signal Processing. California Technical Pub. p. 514. ISBN 978-0-9660176-3-2. Retrieved 2012-12-31.
  2. ^ a b Zehendner, Eberhard (Summer 2008). "Rechnerarithmetik: Fest- und Gleitkommasysteme" (PDF) (Lecture script) (in German). Friedrich-Schiller-Universität Jena. p. 2. Archived (PDF) from the original on 2018-08-07. Retrieved 2018-08-07. [1] (NB).이 참조에서는 MANIAC II의 부동소수점 베이스가 256으로 잘못 표시되어 있지만 실제로는 65536입니다.)
  3. ^ a b c d Beebe, Nelson H. F. (2017-08-22). "Chapter H. Historical floating-point architectures". The Mathematical-Function Computation Handbook - Programming Using the MathCW Portable Software Library (1 ed.). Salt Lake City, UT, USA: Springer International Publishing AG. p. 948. doi:10.1007/978-3-319-64110-2. ISBN 978-3-319-64109-6. LCCN 2017947446. S2CID 30244721.
  4. ^ a b c d e Muller, Jean-Michel; Brisebarre, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Stehlé, Damien; Torres, Serge (2010). Handbook of Floating-Point Arithmetic (1 ed.). Birkhäuser. doi:10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN 2009939668.
  5. ^ Savard, John J. G. (2018) [2007], "The Decimal Floating-Point Standard", quadibloc, archived from the original on 2018-07-03, retrieved 2018-07-16
  6. ^ 파킨슨, 로저(2000-12-07)."2장-고해상도 디지털 현장 조사 시스템-장 2.1-디지털 현지 녹음. 시스템".하이 리스 현장 조사(1판).CRC프레스. p. 24.아이 에스비엔 978-0-20318604-6.2019-08-18 Retrieved.그[디지털 현장 시스템]DFSIV 와DFS5세'와 같은[…]시스템이 4개의 다른 부동 소수 점 시스템과 12dB의 사용 증가 단계를 포함한다.[…](256페이지)
  7. ^ Lazarus, Roger B. (1957-01-30) [1956-10-01]. "MANIAC II" (PDF). Los Alamos, NM, USA: Los Alamos Scientific Laboratory of the University of California. p. 14. LA-2083. Archived (PDF) from the original on 2018-08-07. Retrieved 2018-08-07. […] the Maniac's floating base, which is 216 = 65,536. […] The Maniac's large base permits a considerable increase in the speed of floating point arithmetic. Although such a large base implies the possibility of as many as 15 lead zeros, the large word size of 48 bits guarantees adequate significance. […]
  8. ^ Randell, Brian (1982). "From analytical engine to electronic digital computer: the contributions of Ludgate, Torres, and Bush". IEEE Annals of the History of Computing. 4 (4): 327–341. doi:10.1109/mahc.1982.10042. S2CID 1737953. Incidentally, the paper also contains, almost casually, what I believe to be the first proposal of the idea of floating-point arithmetic!
  9. ^ Rojas, Raúl (April–June 1997). "Konrad Zuse's Legacy: The Architecture of the Z1 and Z3" (PDF). IEEE Annals of the History of Computing. 19 (2): 5–16. doi:10.1109/85.586067. Archived (PDF) from the original on 2022-07-03. Retrieved 2022-07-03. (12페이지)
  10. ^ Rojas, Raúl (2014-06-07). "The Z1: Architecture and Algorithms of Konrad Zuse's First Computer". arXiv:1406.1886 [cs.AR].
  11. ^ a b Kahan, William Morton (1997-07-15). "The Baleful Effect of Computer Languages and Benchmarks upon Applied Mathematics, Physics and Chemistry. John von Neumann Lecture" (PDF). p. 3.
  12. ^ Randell, Brian, ed. (1982) [1973]. The Origins of Digital Computers: Selected Papers (3 ed.). Berlin; New York: Springer-Verlag. p. 244. ISBN 978-3-540-11319-5.
  13. ^ a b Severance, Charles (1998-02-20). "An Interview with the Old Man of Floating-Point".
  14. ^ ISO/IEC 9899:1999 - Programming languages - C. Iso.org. §F.2, note 307. "Extended" is IEC 60559's double-extended data format. Extended refers to both the common 80-bit and quadruple 128-bit IEC 60559 formats.
  15. ^ GNU 컴파일러 컬렉션을 사용하여 i386x86-64 옵션을 2015-01-16으로 Wayback Machine에 보관했습니다.
  16. ^ "long double (GCC specific) and __float128". StackOverflow.
  17. ^ "Procedure Call Standard for the ARM 64-bit Architecture (AArch64)" (PDF). 2013-05-22. Retrieved 2019-09-22.
  18. ^ "ARM Compiler toolchain Compiler Reference, Version 5.03" (PDF). 2013. Section 6.3 Basic data types. Retrieved 2019-11-08.
  19. ^ Kahan, William Morton (2004-11-20). "On the Cost of Floating-Point Computation Without Extra-Precise Arithmetic" (PDF). Retrieved 2012-02-19.
  20. ^ "openEXR". openEXR. Retrieved 2012-04-25.
  21. ^ "IEEE-754 Analysis".
  22. ^ a b c d Goldberg, David (March 1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic" (PDF). ACM Computing Surveys. 23 (1): 5–48. doi:10.1145/103162.103163. S2CID 222008826. Retrieved 2016-01-20. ([2], [3], [4])
  23. ^ a b c Kahan, William Morton; Darcy, Joseph (2001) [1998-03-01]. "How Java's floating-point hurts everyone everywhere" (PDF). Retrieved 2003-09-05.
  24. ^ a b Kahan, William Morton (1981-02-12). "Why do we need a floating-point arithmetic standard?" (PDF). p. 26.
  25. ^ a b Kahan, William Morton (1996-06-11). "The Baleful Effect of Computer Benchmarks upon Applied Mathematics, Physics and Chemistry" (PDF).
  26. ^ Herf, Michael (December 2001). "radix tricks". stereopsis : graphics.
  27. ^ a b Borland staff (1998-07-02) [1994-03-10]. "Converting between Microsoft Binary and IEEE formats". Technical Information Database (TI1431C.txt). Embarcadero USA / Inprise (originally: Borland). ID 1400. Archived from the original on 2019-02-20. Retrieved 2016-05-30. […] _fmsbintoieee(float *src4, float *dest4) […] MS Binary Format […] byte order => m3 m2 m1 exponent […] m1 is most significant byte => sbbb bbbb […] m3 is the least significant byte […] m = mantissa byte […] s = sign bit […] b = bit […] MBF is bias 128 and IEEE is bias 127. […] MBF places the decimal point before the assumed bit, while IEEE places the decimal point after the assumed bit. […] ieee_exp = msbin[3] - 2; /* actually, msbin[3]-1-128+127 */ […] _dmsbintoieee(double *src8, double *dest8) […] MS Binary Format […] byte order => m7 m6 m5 m4 m3 m2 m1 exponent […] m1 is most significant byte => smmm mmmm […] m7 is the least significant byte […] MBF is bias 128 and IEEE is bias 1023. […] MBF places the decimal point before the assumed bit, while IEEE places the decimal point after the assumed bit. […] ieee_exp = msbin[7] - 128 - 1 + 1023; […]
  28. ^ a b Steil, Michael (2008-10-20). "Create your own Version of Microsoft BASIC for 6502". pagetable.com. Archived from the original on 2016-05-30. Retrieved 2016-05-30.
  29. ^ "IEEE vs. Microsoft Binary Format; Rounding Issues (Complete)". Microsoft Support. Microsoft. 2006-11-21. Article ID KB35826, Q35826. Archived from the original on 2020-08-28. Retrieved 2010-02-24.
  30. ^ a b Kharya, Paresh (2020-05-14). "TensorFloat-32 in the A100 GPU Accelerates AI Training, HPC up to 20x". Retrieved 2020-05-16.
  31. ^ "NVIDIA Hopper Architecture In-Depth".
  32. ^ Kahan, William Morton (2006-01-11). "How Futile are Mindless Assessments of Roundoff in Floating-Point Computation?" (PDF).
  33. ^ a b Gay, David M (1990). Correctly Rounded Binary-Decimal and Decimal-Binary Conversions (Technical report). NUMERICAL ANALYSIS MANUSCRIPT 90-10, AT&T BELL LABORATORIES. CiteSeerX 10.1.1.31.4049. (netlab의 dtoa.c)
  34. ^ Loitsch, Florian (2010). "Printing floating-point numbers quickly and accurately with integers" (PDF). Proceedings of the 2010 ACM SIGPLAN Conference on Programming Language Design and Implementation - PLDI '10: 233. doi:10.1145/1806596.1806623. ISBN 9781450300193. S2CID 910409.
  35. ^ "Added Grisu3 algorithm support for double.ToString(). by mazong1123 · Pull Request #14646 · dotnet/coreclr". GitHub.
  36. ^ Adams, Ulf (2018-12-02). "Ryū: fast float-to-string conversion". ACM SIGPLAN Notices. 53 (4): 270–282. doi:10.1145/3296979.3192369. S2CID 218472153.
  37. ^ "google/double-conversion". GitHub. 2020-09-21.
  38. ^ Lemire, Daniel (2021-03-22). "Number parsing at a gigabyte per second". Software: Practice and Experience. 51 (8): 1700–1727. arXiv:2101.11408. doi:10.1002/spe.2984. S2CID 231718830.
  39. ^ Patterson, David A.; Hennessy, John L. (2014). Computer Organization and Design, The Hardware/Software Interface. The Morgan Kaufmann series in computer architecture and design (5th ed.). Waltham, MA: Elsevier. p. 793. ISBN 9789866052675.
  40. ^ a b 미국 특허 3037701A, Huberto M Sierra, "계산기의 부동 소수점 산술 제어 수단", 1962-06-05 발행
  41. ^ a b Kahan, William Morton (1997-10-01). "Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic" (PDF). p. 9.
  42. ^ "D.3.2.1". Intel 64 and IA-32 Architectures Software Developers' Manuals. Vol. 1.
  43. ^ Harris, Richard (October 2010). "You're Going To Have To Think!". Overload (99): 5–10. ISSN 1354-3172. Retrieved 2011-09-24. Far more worrying is cancellation error which can yield catastrophic loss of precision. [5]
  44. ^ Christopher Barker: PEP 485 -- 대략적인 동등성을 테스트하는 함수
  45. ^ "Patriot missile defense, Software problem led to system failure at Dharhan, Saudi Arabia". US Government Accounting Office. GAO report IMTEC 92-26.
  46. ^ Wilkinson, James Hardy (2003-09-08). Ralston, Anthony; Reilly, Edwin D.; Hemmendinger, David (eds.). Error Analysis. Encyclopedia of Computer Science. Wiley. pp. 669–674. ISBN 978-0-470-86412-8. Retrieved 2013-05-14.
  47. ^ Einarsson, Bo (2005). Accuracy and reliability in scientific computing. Society for Industrial and Applied Mathematics (SIAM). pp. 50–. ISBN 978-0-89871-815-7. Retrieved 2013-05-14.
  48. ^ a b c d Higham, Nicholas John (2002). Accuracy and Stability of Numerical Algorithms (2 ed.). Society for Industrial and Applied Mathematics (SIAM). pp. 27–28, 110–123, 493. ISBN 978-0-89871-521-7. 0-89871-355-2.
  49. ^ Oliveira, Suely; Stewart, David E. (2006-09-07). Writing Scientific Software: A Guide to Good Style. Cambridge University Press. pp. 10–. ISBN 978-1-139-45862-7.
  50. ^ a b Kahan, 윌리엄 모턴(2005-07-15)."Floating-Point 산술에 의해 Besieged"Business Decisions""(PDF)(키노트 주소).IEEE-sponsored ARITH 17일 심포지엄 컴퓨터 산술에.를 대신하여 서명함. 6,18.2013-05-23 Retrieved.{{웹을 인용하다.}}:CS1 maint:위치(링크)(NB다. Kahan이 과도하게 부정확한 결과 특이점 근처의 발생률의 요인이 감소된다. 1/2000 이중 확장의 정밀도 11추가 비트를 사용하여 추산하고 있다.).
  51. ^ Kahan, William Morton (2011-08-03). "Desperately Needed Remedies for the Undebuggability of Large Floating-Point Computations in Science and Engineering" (PDF). IFIP/SIAM/NIST Working Conference on Uncertainty Quantification in Scientific Computing Boulder CO. p. 33.
  52. ^ a b c d Kahan, William Morton (2000-08-27). "Marketing versus Mathematics" (PDF). pp. 15, 35, 47.
  53. ^ Kahan, William Morton (2001-06-04). Bindel, David (ed.). "Lecture notes of System Support for Scientific Computation" (PDF).
  54. ^ "General Decimal Arithmetic". Speleotrove.com. Retrieved 2012-04-25.
  55. ^ Christiansen, Tom; Torkington, Nathan; et al. (2006). "perlfaq4 / Why is int() broken?". perldoc.perl.org. Retrieved 2011-01-11.
  56. ^ Shewchuk, Jonathan Richard (1997). "Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates". Discrete & Computational Geometry. 18 (3): 305–363. doi:10.1007/PL00009321.
  57. ^ Kahan, William Morton; Ivory, Melody Y. (1997-07-03). "Roundoff Degrades an Idealized Cantilever" (PDF).
  58. ^ "Auto-Vectorization in LLVM". LLVM 13 documentation. We support floating point reduction operations when -ffast-math is used.
  59. ^ "FloatingPointMath". GCC Wiki.
  60. ^ "55522 – -funsafe-math-optimizations is unexpectedly harmful, especially w/ -shared". gcc.gnu.org.
  61. ^ "Code Gen Options (The GNU Fortran Compiler)". gcc.gnu.org.
  62. ^ "Bug in zheevd · Issue #43 · Reference-LAPACK/lapack". GitHub.
  63. ^ Becker, Heiko; Darulova, Eva; Myreen, Magnus O.; Tatlock, Zachary (2019). Icing: Supporting Fast-Math Style Optimizations in a Verified Compiler. CAV 2019: Computer Aided Verification. Vol. 11562. pp. 155–173. doi:10.1007/978-3-030-25543-5_10.

추가 정보

외부 링크

  • "Survey of Floating-Point Formats". (NB. 이 페이지에는 수년간 사용된 부동소수점 형식의 간단한 요약이 나와 있습니다).
  • Monniaux, 데이비드(2008년 5월)."프로토 완성 차 부동 소수 점 계산의 함정".프로그래밍 언어 및 시스템에 ACMTransactions이.미국 컴퓨터 학회(ACM)프로그래밍 언어와 시스템의 거래.(TOPLAS). 30(3):1–41. arXiv:cs/0701192. doi:10.1145/1353445.1353446.S2CID 218578808.(NB다. 인기 있는 구조들에 대한 부동 소수 점의non-intuitive의 행동들을 프로그램 검증과 시험에 의미와 함께 한권,.).
  • OpenCores. (NB)이 웹사이트에는 FPGA 또는 ASIC 디바이스에서 부동소수점 연산자를 구현하기 위한 오픈소스 부동소수점 IP 코어가 포함되어 있습니다.double_fpu 프로젝트에는 이중 정밀도 부동 소수점 단위의 verilog 소스 코드가 포함되어 있습니다.프로젝트 fpuvhdl에는 단정도 부동소수점 단위의 VHDL 소스 코드가 포함되어 있습니다.)
  • Fleegal, Eric (2004). "Microsoft Visual C++ Floating-Point Optimization". MSDN.