2014-06-09 4 views
0

나는 부동 소수점이 완벽하지 않다는 것을 안다. float 또는 double이지만, 하나의 부동 소수점 수를 다른 수로 나눌 때 배수가 나누기로 나눌 수 있음을 의미한다 (예 : 10000.0이 10.0으로 나눌 수 있음) 미리 알림없이 .99999999 ... 끝에 작은 수의 올바른 결과보다 작은 숫자 만 얻을 수 있습니다. 그런 일이 부동 소수점에서 일어날 수 있습니까?부동 소수점 나누기 불완전

내가 floor 함수를 적용해야하기 때문에 알고 있어야합니다. 부동 소수점 구분이 실제로 불완전하면 큰 차이가 있습니다.

+2

예 [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] [1]을 읽을 수 있습니다. [1] : http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – 101010

+1

C/C++ 표준에 따르면 구현 정의 동작입니다. 결과가 정확하다면 IEEE로 진행하면됩니다. 즉 '1000/10'은 결코'99.9999999'를 산출하지 않습니다. – Mysticial

+0

100 % 정밀도를 원하면 합리적인 수 (정수 분자와 정수 분모로 구성)에 대한 모든 산술 연산을 지원하는 클래스를 설계하고 구현할 수 있습니다. 예를 들어, https://github.com/barakman/Num에서 완전히 테스트 된 클래스를 참조하십시오. –

답변

7

는 것을 의미합니까, 내가 다른 하나 부동 소수점 숫자를 분할하고 배당은 알림없이 분할로 나누어 때이 번호를 얻을, 그것은 가능 (같은 10000.0 10.0로 나누어) .99999999 ... 끝에서

번 IEEE 754 부분이 올바르게 반올림 됨. 결과에 대해 표현할 수있는 부동 소수점 숫자 (예 : 1000)가 있으면이 결과가 나눗셈에 적용됩니다.

0.1이라고 썼고 이것이 수학적 값 0.1이라고 생각하기 때문에 생각하는 숫자를 나눌 수 없습니다. 이 경우 최종 결과는 놀랄 수 있지만 이는 부동 소수점 실수의 아무런 결함이 아닙니다.

당신은 당신이 의미하는 숫자를 나누는 것을 알고있는 한, 분할의 수학적 결과는, 말, 2 24 아래의 정수, 그 정수가됩니다 부동 소수점 부문의 다음 결과 인 경우 .

+0

그래서 아무리 크거나 작은 숫자라도 소수 부분없이 자연수를 표현하고 다른 부분으로 나눌 수있는 한, 나눗셈 후 결과 숫자에 분수 부분이 없으며 GCC/MVC? –

+0

아니요, 세 개의 숫자, 두 입력 및 결과가 모두 정확하게 표현 될 수있는 경우에만. –

+3

@DesmondHume "숫자가 얼마나 크건 작든간에 소수 부분이없는 자연수를 나타내는 한 ..."예, 2^24보다 큰 자연수는 'float'로 표현할 수 없습니다 (한도 'double '은 2^53 임). "on any CPU"이것은 적어도 대략적으로 IEEE 754를 구현하는 CPU (및 컴파일 플랫폼)이어야합니다. IA-32, x86-64 또는 최신 ARM 주문은 모두 유효합니다. –

2

하드웨어가 IEEE 754 부동 소수점 나누기를 사용한다고 가정 할 때 중요한 문제는 자연수 피연산자가 정확히 표현 가능한지 여부입니다.

먼저 형식은 유한 범위를가집니다. 자연수는 그렇지 않습니다. 그러나 32 비트 이진 부동 소수점 제한 (약 10^38)조차도 대부분의 실제적인 목적을 위해 충분히 큽니다. 그 범위 내

, 그것은 자연수 n 정수이고 1.x는 이진 소수점 후 이하 23 비트 이진 1.x*2^n 분율로 표현 될 수 있는지에 내린다. 24 비트에 들어 맞는 모든 자연수가이 조건을 충족시킵니다. 범위 안에있는 두 가지의 모든 힘을 다하십시오.

일반적으로 더 큰 지수를 갖는 더 큰 수레는 연속 값 사이에 큰 차이가 있습니다. 최대 24 비트 자연체는 간격이 1보다 크지 않으므로 모든 자연수를 나타낼 수 있습니다. 다음 단계에서 갭은 지수가 증가함에 따라 2, 4, 8이됩니다.