컴퓨터가 더 이상 수학 연산에서 동일한 결과를 얻도록하려면 여전히 고정 소수점을 사용해야합니까?


9

대부분의 최신 컴퓨터는 동일한 부동 소수점 표준을 따릅니다. 입력이 동일하면 주어진 수학 연산에 대해 모두 동일한 부동 소수점 응답을 얻습니까?

나는 네트워크에서 RTS 게임을 연구하고 수백 개의 유닛 위치를 동기화하는 것이 나쁜 길처럼 들리기 때문에 묻습니다.

따라서 입력 만 보내면 모든 클라이언트가 해당 입력에서 시뮬레이션을 실행하여 동일한 결과를 얻도록 보장해야합니다.

오래된 RTS 게임에서 고정 소수점 산술을 사용했지만 최신 컴퓨터에서 모두 동일한 표준을 준수하는지 여부를 모르겠습니다. 또한 부정확하지만 부동 소수점의 결과는 동일한 입력에 대해 결정적이라고 들었습니다 (동일한 표준을 따르는 모든 컴퓨터가 동일한 부정확 한 결과를 얻는다는 것을 의미합니다).

컴퓨터가 동일한 부동 소수점 표준을 따르더라도 여전히 편차가 있습니까?

나는 C # 에서이 게임을 작성하고 있지만 그것이 중요하다면 확실하지 않다. 어쨌든 언급 할 것이라고 생각했다.


그들이하더라도, 나는 그것을 위해 수레를 사용하지 않을 것입니다
Telastyn

무슨 소리 야? 왜 안돼?
WDUK

동작은지도상의 위치에 따라 달라질 수 있으므로 수레를 사용하는 것은 바람직하지 않습니다. Minecraft의 Far Lands 가 더 주목할만한 예입니다. 스폰 지점에서 멀리 이동하면 움직임, 렌더링 및 지형 생성에 문제가 생길 수 있습니다.
amon

답변:


18

컴퓨터가 동일한 부동 소수점 표준을 따르더라도 여전히 편차가 있습니까?

불행히도, 특히 C # (또는 다른 JIT 컴파일 언어)을 사용할 때 특히 그렇습니다. 여기서 발생하는 문제는 일부 프로세서 아키텍처의 JIT 컴파일 단계에서 다른 아키텍처보다 많은 CPU 레지스터를 사용하는 코드를 생성한다는 것입니다. 이로 인해 일부 기계에서는 확장 부동 소수점 정밀도 가 특정 작업에 사용되지만 다른 기계에서는 그렇지 않은 상황이 발생할 수 있습니다 . 이것은 복식을 사용하는 모든 반복 계산에 대해 다른 누적 반올림 오차가 발생할 수 있음을 의미합니다.

그것은 가상의 문제가 아니며, 현대의 엔지니어링 시뮬레이션 소프트웨어에서 현대 하드웨어에 대한 이러한 편차에 대한 직접적인 경험이 있습니다. 이 문제로 인해 복잡한 모든 부동 소수점 계산에 대해 신뢰할 수있는 회귀 테스트를 작성하기가 매우 어려워서 관련된 모든 기계에서 정확히 동일한 결과를 생성합니다.


이. 근본 원인 : IEEE Std 754는 선택적 "should"절 (예 : NaN 처리)을 포함하고 설계 대안 (예 : 언더 플로 감지)을 허용합니다. 언어 바인딩이 부동 소수점 표준을 지원하는 한, FLT_EVAL_METHODISO C / C ++에서 와 같이 부동 소수점 표현식을 평가할 때 여전히 컴파일러에 대한 여지를 줄 수 있습니다 . 초월 함수 (예를 들어 sin, exp, log) 크게 IEEE 부동 소수점 표준 및 언어 표준 프로그래밍 모두에 의해 제재도받지 않고있다. 간단한 라이브러리 버전 업그레이드 (예 : 새 glibc버전)로 인해 결과가 달라질 수 있습니다.
njuffa

나는 게임에서 직접 쳤다. 로켓은 랩톱에서 제대로 날아 갔고 데스크탑에서 완전히 똑같이 설치되지 않았습니다.
Loren Pechtel

3

부동 소수점 오류

모든 부동 소수점 숫자는 계산에 사용될 때 부정확성을 누적합니다. 이것은 부정확 한 형식을 사용하여 계산하는 간단한 사실입니다. 계산은 계산 순서에 민감하며, commutativity가 보장되지 않습니다. 즉 (a + b) + c,와 같거나 같지 않을 수 있습니다 a + (b + c).

또한 프로세서는 반드시 메모리 표준과 가수 길이가 같을 필요는 없습니다. 32/64/128 비트 플로트는 때때로 더 많은 비트를 갖는 것처럼 작동하므로 흥미로운 동작을 생성 할 수 있습니다.

고정 소수점 오류

상기 고정 소수점 산술은 에러를 누적시킬 수있다. 차이점은 고정 소수점 수는 손실되는 정밀도에 대해 명확하며 선택한 작업에 따라 반올림 오류를 완전히 피할 수 있다는 것입니다. 그들은 또한 정류 적 (a + b) + c = a + (b + c)입니다.

어느?

어느 것을 사용할지는 전적으로 필요한 속성에 달려 있습니다.

부동 소수점 숫자 :

  • 매우 세밀한 클로즈업이되고 극단에서 점차 멀어지게되는 광범위한 범위의 값을 제공합니다.
  • 계산 순서에 민감하다
  • 시간이 지남에 따라 반올림 오류가 누적됩니다.
  • 하드웨어 / 메모리 플로트 크기 불일치로 인해 오류가 발생할 수 있습니다.

고정 소수점 수 :

  • 연속 된 두 숫자 사이의 거리가 같은 더 작은 숫자 범위를 제공하십시오.
  • 계산 순서에 덜 민감하다
  • 반올림 오류가 더 명확합니다.
  • 반올림 문제를 최소화하거나 피하기 위해 함께 사용할 수 있습니다.

1
"고정 점 수는 정밀도 손실에 대해 명확하다"-부동 소수점도 분명하다. 그 차이는 오히려 고정 소수점 부정확성이 평범한 라이프 넘버링에보다 직관적이다
whatsisname

1
따라서 고정 소수점만이 하드웨어 등에 관계없이 모든 컴퓨터에서 동일한 오류 / 정밀 손실을 경험할 수 있습니까?
WDUK

1
기본적으로 고정 소수점 수는 32 또는 64 비트이며 모든 시스템에 존재하도록 지정할 수 있기 때문에 가능합니다. 부동 소수점 숫자는 32 비트 또는 64 비트 일 수 있지만 하드웨어는 실제로 48 비트 또는 96 비트를 사용하여 계산을 수행하고 마지막에 32 비트 또는 64 비트로 변환하여 다른 유형의 하드웨어간에 차이가 발생할 수 있습니다.
user1118321

@whatsisname 부동 소수점 사양은 분명하지만이 합계에서 어떤 반올림 문제가 발생했는지 쉽게 알 수 없습니다 (a + b * c) / d - e. NaN, 0으로 나누기 또는 오버플로 / 언더 플로 와 같은 명백한 문제를 제외하고이식 이 잘못되었을 수 있습니다. 또한 메모리와 레지스터 사이의 정밀도는 정밀성과 "동일한"부동 소수점 값의 메모리에서 간단한로드 / 저장까지의 응답이 변경됩니다.
Kain0_0

@ Kain0_0 : 당신이 맞습니다. 부동 소수점 전문가가 아니기 때문에 내가 겪을 일을 쉽게 말할 수 없습니다. 그것이 바로 "일반적인 생활 번호에보다 직관적"이라고 말했을 때의 의미입니다. 고정 소수점이 "투명"하고 부동 소수점이 아니라면 플로트가 무작위로 부정확 한 것처럼 들립니다.
whatsisname

-1

동일한 결과가 결과가 유용 하다는 보장은 없기 때문에 동일한 결과를 보장하려는 이유에 대한 의문이 있습니다 .

서로 다른 컴퓨터에서 두 개의 동일하지만 완전히 무의미한 결과를 제공하는 수치 적으로 불안정한 알고리즘을 가질 수 있습니다. 차이점이 있지만 결과가 13 자리 내에서 동일하면 훨씬 더 신뢰할 수 있습니다.

레이아웃 엔진 또는 무손실 압축 / 압축 해제에서 재현성이 정말로 중요한 상황은 거의 없습니다. 고정 소수점을 사용하면 잘못 안내 될 수 있습니다.


나는 당신의 대답을 무시하지 않았지만, OP에 의해 묘사 된 사례는 정확히 "재현성이 정말로 중요한 몇 가지 상황 중 하나"인 것 같습니다. RTS 게임에서 작은 반올림 오류는 "두 개체 충돌"의 차이를 만들 수 있습니다.
Doc Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.