정밀도 손실없이 실수를 나타냅니다


10

현재 부동 소수점 (ANSI C float, double) 은 실수 의 근사값 을 나타냅니다 . 실수없이 실수
나타내는 방법이 있습니까?
여기에 내가 가진 아이디어가 있습니다.

예를 들어 1/3은 0.33333333 ... (기본 10) 또는 o.01010101 ... (기본 2)이지만 0.1 (기본 3)
이 "구조"를 구현하는 것이 좋습니다.

base, mantissa, exponent

1/3은 3 ^ -1이 될 수 있습니다

{[11] = base 3, [1.0] mantissa, [-1] exponent}

다른 아이디어가 있습니까?


12
이런 식으로 합리적인 숫자 만 나타낼 수 있습니다.
Andrej Bauer

이 표현에서 숫자에 대한 산술 연산을 어떻게 구현할 것을 제안합니까? 대수를 사용하여 밑을 바꾸시겠습니까? 이것은 IEEE 부동 소수점 수학보다 훨씬 비쌉니다.
David Zhang

글쎄요 나는 엔지니어가 아닙니다 :) 분명히, 나는 그것을 하드웨어로 구현할 수 없습니다. C에서는 느리고 비효율적 인 구현이 가능합니다. 이것은 실험
일뿐입니다.

답변:


20

그것은 모두 당신이하고 싶은 것에 달려 있습니다.

예를 들어, 당신이 보여주는 것은 유리수를 표현하는 좋은 방법입니다. 그러나 여전히 또는 와 같은 것을 완벽하게 나타낼 수는 없습니다 .πe

실제로 Haskell 및 Scheme과 같은 많은 언어는 합리적인 숫자를 지원하여 형식으로 저장합니다. 여기서 는 정수입니다.aba,b

이것들이 널리 사용되지 않는 주된 이유는 성능입니다. 부동 소수점 숫자는 약간 정확하지 않지만 작동은 하드웨어로 구현됩니다. 제안 된 시스템은 정확도를 높일 수 있지만 하드웨어에서 수행 할 수있는 단일 작업과 달리 구현하는 데 여러 단계가 필요합니다.

정지 숫자 와 같은 일부 실수는 계산할 수없는 것으로 알려져 있습니다 . 와 달리 숫자를 열거하는 알고리즘은 없습니다 . 여기서 우리는 충분히 오래 기다리는 한 번째 숫자를 계산할 수 있습니다 .πn

비합리적이거나 초월적인 수에 대한 정확한 정밀도를 원한다면 일종의 상징적 대수 시스템을 사용해야 할 것입니다. 그런 다음 상징적 형태로 최종 답을 얻으십시오. 그러나 위에서 설명한 결정 불가능한 문제로 인해이 방법은 반드시 제한적입니다. 적분 근사 또는 무한 계열과 같은 경우에도 여전히 좋습니다.


다른 질문을해도 될까요? 80 년대 인텔 엔지니어였던 경우 실수 형식을 어떻게 "설계"했습니까?
incud

3
나는 엔지니어가 아니기 때문에 나는 이론 연구원이라는 대답을 할 자격이 없습니다. 나는 IEEE float과 double 표준, 그리고 quad가 잘못되었다고 생각하지 않습니다. 고정밀 산술과 소프트웨어 지원 버전을 사용할 수있는 응용 프로그램에 따라 많은 응용 프로그램이 있다고 생각하지 않습니다.
jmite

상징적 대수는 정확한 실제 산술을위한 올바른 형식이 아닙니다. 임의로 큰 가수를 허용하는 표현이 필요합니다.
Andrej Bauer

8
@AndrejBauer : 의 정확한 표현을 원한다면 임의로 큰 가수가 저장되지 않습니다 . 2
user2357112는 Monica

@jmite 당신은 너무 겸손 :)
incud

22

각 숫자가 유한 표현 인 경우 오류없이 모든 실수를 나타내는 방법은 없습니다. 실수는 많지 않지만 1과 0의 유한 문자열은 숫자로 표현할 수 있습니다.


요구 사항이 모든 실수를 표현하는 것을 제한 할 수 있으며, 이는 실수를 제한하는 것으로, 이는 튜링 머신의 출력 일 수 있습니다. 그것은 실제 수의 셀 수에 지나지 않지만, 당신이 표현하고 싶은 모든 수를 포함합니다. 그러나 나는 당신이 그러한 숫자로 효율적인 계산을 할 수 있다고 생각하지 않습니다.
kasperd

3
@kasperd 그것들을 계산 가능한 실수 라고 합니다. 불행하게도 평등과 같은 것은 계산 가능한 현실에 대해 계산할 수 없습니다.
David Richerby

실제로 그러한 수의 평등을 계산하는 것이 정지 문제를 해결하는 것과 동등하다는 것은 분명합니다. TM이 주어지면 실수를 정의 할 수 있습니다.이 숫자는 TM의 실행 시간만큼 정확하게 0으로 시작하고 그 다음에 1 이옵니다. 이 숫자를 0으로 비교하는 것은 원래 TM의 중지 문제를 해결하는 것과 같습니다.
kasperd

이 대답은 거짓입니다. Alan Turing은 자신이 Turing 기계를 발명 한 기계에 관한 첫 번째 논문에서 실수를 무한한 데이터 문자열 로 표현하는 것에 대해 이야기 합니다. 이것은 소위 "Type II Turing machine"이라는 아이디어로 이어지고, 그 아이디어에 기초한 실수 계산에 대한 매우 성공적인 이론이 있습니다. 그것은 실제로 구현되어 있습니다. 내 대답을 참조하십시오.
Andrej Bauer

1
아마도 기술적으로는 할 수 있지만 요점을 놓치게됩니다. 이는 실수 로 완벽하게 합당한 무한한 표현이 있다는 것입니다. TCP / IP 연결, Skype 호출 또는 카메라의 비디오 피드는 모두 (잠재적으로) 무한한 양의 데이터의 예입니다. 그들이 제공 할 수있는 정보의 양에 대한 사전 제한은 없습니다. 한정된 시간 내에 정보에서 얻을 수있는 정보의 양에는 제한이 있습니다.
Andrej Bauer

7

숫자가 기본으로 표시하기 때문에 귀하의 생각은 일을하지 않는 가수와 m 와 지수 전자 합리적 번호 B m - e는 따라서 귀하의 표현은 유리수없이 다른 사람을 위해 정확하게 작동합니다. √를 대표 할 수 없습니다mebme예를 들어 2 입니다.2

정확한 실제 산술을 다루는 계산 가능한 수학의 전체 분기가 있습니다. 정확한 실수 를 표현하기위한 많은 데이터 구조 가 제안되어왔다 : 숫자 스트림, 아핀 수축 스트림, 코시 시퀀스, 코시 시퀀스, 이분법 컷, 축소 구간 시퀀스 등 정확한 실제 산술 기반 구현이있다. 예를 들어 이러한 아이디어에 대해

이 iRRAM 중에서 가장 성숙하고 효율적입니다. 실험 프로젝트의 마샬, 세 번째 프로젝트는 학생 프로젝트이지만 가장 쉽게 액세스 할 수있는 프로젝트입니다. 실수 계산에 관한 문제를 설명하는 아주 좋은 소개가 있습니다. 나는 그것을 보는 것이 좋습니다.

말을하겠습니다. 누군가는 컴퓨터로 무한한 물체를 표현할 수 없다고 반대 할 것입니다. 어떤면에서는 이것이 사실이지만 다른면에서는 그렇지 않습니다. 우리는 이제까지 표현하지 않아도 모든 실수를, 우리는 단지 필요 유한 근사치를계산의 각 단계에서. 따라서 우리는 주어진 정밀도까지 실수를 나타낼 수있는 표현 만 필요합니다. 물론 컴퓨터 메모리가 부족하면 컴퓨터 메모리가 부족하지만 이는 표현 자체가 아니라 컴퓨터의 한계입니다. 이 상황은 프로그래밍에서 다른 많은 사람들과 다르지 않습니다. 예를 들어, 사람들은 파이썬에서 정수를 사용하며 물론 사용 가능한 메모리의 크기를 초과 할 수는 없지만 "임의로 큰"것으로 생각합니다. 때때로 무한대는 매우 큰 유한 수에 대한 유용한 근사치입니다.

또한 컴퓨터가 계산 가능한 실수 만 처리 할 수 ​​있다는 주장을 자주 듣습니다 . 이것은 두 가지 중요한 사항을 놓칩니다. 첫째, 컴퓨터는 외부 세계의 데이터에 액세스 할 수 있으므로 외부 세계도 계산 가능하다는 가정 (확인할 수 없음)을 가정해야합니다. 둘째, 컴퓨터가 계산할 수있는 영역과 컴퓨터가 나타낼 수있는 영역을 구분해야합니다. 우리는 실수의 표현과 같은 숫자의 스트림을 선택하면 예를 들어, 완벽하게 가능하다 표현 이 아닌 계산 가능한 현실 : 누군가가 우리에게 준 경우 우리가 그것을 표현하는 방법을 알고있다. 그러나 실수를 숫자를 계산하는 소스 코드 조각으로 표현하기로 선택하면 계산할 수없는 실수를 분명히 표현할 수 없습니다.

어쨌든이 주제는 추가로 읽을 때 가장 잘 다루어집니다.


+1이지만 질문에 필요한 정밀도를 잃지 않고 유한 근사로 무한 문자열을 표현할 수 없다고 반대합니다 . 물론, 당신은 합리적으로 근사한만큼 가능한 한 많은 정밀도를 얻을 수 있습니다. 그러나 그것은 질문이 요구하는 것이 아닙니다. 아마도 그것은 대답이 아닌 질문의 문제입니다.
David Richerby

2
요점은 우리가 유한 문자열로 표현 하지 않는다는 것 입니다. 우리는 무한 문자열 로 표현하고 있지만 계산 단계마다 무한 문자열의 유한 부분 만 필요합니다. 데이터 구조가 전체 정보를 보유하고 있기 때문에 정밀도 손실 이 없습니다. 물론 모든 정보를 한 번에 액세스하거나 처리 할 수는 없습니다. 데이터 구조는 원하는만큼의 정밀도를 제공합니다. . 병목 현상은 데이터 구조 측면이 아니라 정보를 얻는 "소비자"측면에 있습니다.
Andrej Bauer

@AndrejBauer 그러나 어떤 경우에는 한 번에 모든 정보에 액세스하거나 처리 해야합니다 . 예를 들어 이것은 다른 숫자 스트림이 아닌 수량의 "본질"또는 본질을 캡처하여 기호 계산이 수행하는 작업입니다. 를 확인하기 위해 기호 계산 패키지에 지시하면이면 즉시 true를 출력합니다. 당신이 방법을 사용하면 첫 번째 고려하여, 설명하는 것케이의 제곱근의 숫자2를위해,어떤K당신이를 결론 지을 것이다22=2k2 k이므로 결과는 (임의의k에 대해)1.99 ...와같으며 오답입니다. 계산은 유한합니다. 222k1.99...
Thomas

2
@Thomas : 기호 계산은 실수를 나타내지 않지만 일반적으로 실수의 일부 하위 필드 (대개 기본 함수와 다항식의 근에 의해 생성 된 일부)를 나타냅니다. 이 서브 필드는 완전하지 않거나 (Cauchy 시퀀스의 한계에 의해 폐쇄 됨) 계산 가능하지 않습니다 (Cauchy 시퀀스의 계산 가능한 한계에 의해 폐쇄 됨). 표현은 모든 (계산 가능한) 실수를 표현할 수없는 한 실수 의 표현이 아니며 기호 계산이이 조건에 실패합니다.
Andrej Bauer

1
계산 가능한 실수는 계산할 수 없기 때문에 계산 가능성에 대한 이러한 언급은 관련이 없습니다.
Andrej Bauer

7

효과적인 Rational Number 구현 에는 여러 가지가 있지만 여러 번 제안되었으며 일부 비이성적 인 부분도 상당히 잘 처리 할 수있는 구현 은 Continued Fractions 입니다.

대런 C. 콜린스에 의해 계속 분수 에서 인용 :

정리 5-1. -실수가 합리적인 경우에만 실수의 연속 분수 표현은 유한합니다.

인용 매스 월드 - 정기 계속 분수를

... 이차 다항식의 근본 인 경우 계속되는 분수는 주기적입니다.

즉, 모든 근은 주기적 연속 분율로 표현 될 수 있습니다.

@AndrejBauer가 실제로 그렇지 않다는 것을 지적 할 때까지 나를 놀라게 한 π에 대한 정확한 계속 분수 가 있습니다 .


마지막 문장이 잘못되었습니다. 대한 유한 (또는 주기적) 연속 분수는 없습니다 . π 에 대한 연속 분율 은 무한하며 비 주기적입니다. ππ
DW

J. Vuillemin에 의해 정확한 실제 산술을 구현하기 위해 실수의 연속 분수 표현이 제안되었습니다. 숫자가 곧 커질수록 효율성이 떨어지고 크기를 줄이기가 어렵습니다.
Andrej Bauer

연속 분수는 유리수를 표현할 때에도 계산상의 문제가 있습니다-사전 순서의 변형을 사용하여 비교적 빠르게 비교할 수 있고 단일 연속 분수 를 조작하는 것은 쉽지만 CF에 대한 (이진) 덧셈과 곱셈은 상당히 복잡한 연산입니다. 도구.
Steven Stadnicki

5

주석에는 "정확한"제안이 많이 있습니다 (예 : 연속 분수, 선형 분수 변환 등). 일반적으로 수식에 대한 답을 계산할 수는 있지만 평등을 결정할 수없는 경우가 많습니다.

그러나 대수에 관심이 있다면 운이 좋을 것입니다. 실제 닫힌 필드의 이론은 완전하고 o- 최소하며 결정 가능합니다. 이것은 Tar48에 의해 1948 년에 입증되었습니다.

그러나 캐치가 있습니다. Tarski의 알고리즘은 복잡하지 않은 알고리즘 인 NONELEMENTARY의 복잡한 클래스에 있기 때문에 사용하지 않으려 고합니다. 복잡성을 DEXP로 낮추는 최근의 방법이 있는데, 이것이 현재 우리가 알고있는 최선입니다.

문제는 SAT를 포함하므로 NP-hard입니다. 그러나 NP에있는 것으로 알려져 있지 않습니다.

편집 나는 이것을 조금 더 설명하려고 노력할 것이다.

이 모든 것을 이해하기위한 프레임 워크는 만족도 모듈로 이론 (Satisability Modulo Theory, SMT)으로 알려진 결정 문제입니다. 기본적으로 우리는 고전적인 논리 위에 세워진 이론에 대해 SAT를 풀고 싶습니다.

따라서 평등 테스트를 통해 1 차 고전 논리로 시작합니다. 우리가 포함시키고 자하는 기능 기호와 그 공리에 따라 이론이 결정 가능한지 여부가 결정됩니다.

SMT 프레임 워크에 표현 된 흥미로운 이론이 많이 있습니다. 예를 들어, 프로그램의 정확성을 입증하는 데 사용되는 데이터 구조 이론 (예 : 목록, 이진 트리 등)과 유클리드 기하학 이론이 있습니다. 그러나 우리의 목적을 위해, 우리는 다른 종류의 수의 이론을보고 있습니다.

Presburger 산술은 자연수에 대한 이론을 더한 것입니다. 이 이론은 결정 가능하다.

Peano 산술은 덧셈과 곱셈을 갖는 자연수 이론입니다. 이 이론은 괴델 (Gödel)에 의해 유명한 것으로 결정될 수 없다.

Tarski 산술은 모든 필드 연산 (더하기, 빼기, 곱하기 및 나누기)이 포함 된 실수의 이론입니다. 흥미롭게도,이 이론은 결정 가능합니다. 당시에는 매우 직관적 인 결과였습니다. 자연수의 "슈퍼 셋"이기 때문에 "더 어렵다"고 가정 할 수 있지만, 그렇지 않습니다. 예를 들어, 정수에 대한 선형 프로그래밍과 유리수에 대한 선형 프로그래밍을 비교하십시오.

만족이 당신에게 필요한 전부라는 것은 명백하지 않을 수도 있지만, 그뿐입니다. 예를 들어, 양의 제곱근 2가 실제 큐브 근인 3과 같은지 여부를 테스트하려는 경우이를 만족도 문제로 표현할 수 있습니다.

엑스.엑스>0엑스22=0엑스=0

이자형엑스

{엑스π|엑스=0}

이자형엑스이자형나는엑스


Alfred Tarski (1948), 기초 대수와 기하학을위한 결정 방법 .


2

다항식의 근으로 취급하여 대수 라고하는 매우 큰 수의 클래스를 정확하게 표현할 수 있습니다 .

πe


eeixsincos{xR|sinx=0}

@Pseudonym 이것은 정말 흥미로운 것 같지만 제대로 이해하기위한 수학적 배경이 없다고 생각합니다 ... "정수에 충분히 가까워졌다"는 것은 무엇을 의미합니까?
더 많은 도끼

설명을 위해 답변을 수정하겠습니다.
가명

1

π2


이 대답은 거짓입니다. 컴퓨터로 실제를 표현하는 방법을 설명하는 정확한 실제 산술의 전체 영역이 있습니다. 실수가 유한 문자열로 표현되어야한다는 가정은 잘못되었습니다. 무한 문자열도 사용할 수 있습니다. Alan Turing은 이미 그의 논문에서 튜링 기계를 발명 한 논문 에 대해 썼습니다 .
Andrej Bauer

실제 컴퓨터에서 부정확 한 문자열을 저장하고 조작하는 방법에 대한 논문을 링크하면 질문에 대한 답변이 될 수 있습니다. 또한 그의 첫 번째 논문은
아니고

1937 년의 논문이 맞습니다. 무한 문자열이 어떻게 조작되는지 보려면 예를 들어 TCP / IP 프로토콜을 볼 수 있습니다. 나는 실제 전체가 컴퓨터에 저장되어야한다고 말한 적이 없다.
Andrej Bauer

-1

컴퓨터에서 모든 실수를 나타낼 수는 없지만 많은 숫자를 나타낼 수 있습니다. float보다 많은 수를 나타내는 분수를 사용할 수 있습니다. 뉴턴 방법 하에서 숫자로 수렴되는 근사값을 사용하여 다항식의 근본으로 숫자를 나타내는 것과 같이보다 정교한 작업을 수행 할 수도 있습니다.


이것은 다시 무지에서 나온 잘못된 대답입니다. 적절한 데이터 구조로 모든 실수 를 나타내는 방법을 연구하는 정확한 실제 산술 영역이 있습니다.
Andrej Bauer

@AndrejBauer 그래서 당신은 어떤 실수를 나타낼 수있는 데이터 구조가 있다고 제안하고 있습니까? 이러한 데이터 구조는 숫자를 나타 내기 위해 셀 수없는 무한 비트를 사용해야합니다.
Alice Ryhl

1
셀 수있는 비트 접미사의 양, 우선, 당신은 한 번에 모두 필요하지 않으며, 한 번에 모두 처리 할 수 있기 때문에, 그들은 잘 공간으로 같은 시간에 저장할 수 있습니다.
Andrej Bauer

@AndrejBauer이 답변은 정답이며 정보는 훨씬 적지 만 귀하와 동일한 내용을 말합니다. 컴퓨터에서 모든 실수를 표현할 수는 없습니다 . 실수 를 표현할 수 있지만 한 번에 모두 표현할 수는 없습니다 . 어쨌든 주어진 컴퓨터에서 유한하게 만 표현할 수 있고 일반적인 계산 모델과 동등한 추상 컴퓨터에서는 거의 수학적으로 표현할 수 없기 때문에“많은”을 표현할 수 있다고 주장합니다. 기계 동등).
Gilles 'SO- 악 그만해라'

-1

입력이 때문에, 예를 들어, 저장 작업의 문자열로 저장하여 표현할 수있는 곳을 정확하게 어떤 수를 나타냅니다 할 수 1/3와 같은 1 divided by 3당신이 정확한 답을 제공하기 위해 다음 작업을 단순화 할 수있는 작업의 취소 처리하여, (1/3) * 3. 또한 π계산에 비이성적 인 것으로 알려진 상황을 처리 할 수도 있습니다 .

그러나 각 숫자마다 메모리 양이 증가해야하며 단순화가 완벽하지 않다고 가정하면 많이 작업하는 값의 양이 계속 증가해야합니다.


5+262=

과연. 실제로, 완전히 성공적으로 자동화하는 것은 사실상 불가능합니다. 그러나 가장 간단한 표현을 사용하지 않더라도 결과는 정확합니다.
Jack Aidley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.