내가 사용하고있는 언어가 무엇이든간에 플로트가 저장되는 방법을 지정한다고 생각합니다. 나는 자바가 특정 IEEE 표준 (754, 나는 생각한다)을 사용하여 이것을 수행한다는 것을 알고있다.
지정되지 않은 경우, 실제 숫자가 변경되는지 확인하기 위해 0.5를 1로 추가하여 직접 점검 할 수 있다고 생각합니다. 만약 그렇다면, 다음, 1 0.25를 추가 0.125 1 등 번호가 변경되지 않을 때까지, 뭔가 같은 :
float a = 1;
float b = 0.5;
int bits = 0;
while (a + b != a) {
bits = bits + 1;
b = b/2;
}
만 다음 3 가수 비트, 1 + 1/16이 있다면
그런 다음 가수를 다 써 버렸습니다.
IEEE754는 처음에 묵시적 '1+'을 사용하기 때문에 실제로는 1이 아닌 2가되어야 할 수도 있습니다.
EDIT : 그것은 명확히 4 바이트 수레를 갖는 시스템에 대해 63 비트를 제공로
그것은 어떤 문제가 발생할 전술 한 방법을 보인다. 즉, 중간 결과가 어떻게 든
단위 값 a
가 가까워 비트로 표현 될 수있는 가능성 (I 명시 캐스트와 같은 코드 이후 의심 [while (((float)(a + b) != (float)(a))
들은 유사 문제가) 또는 (나 가능성 판단) 지수를 조정하여 분수 b
에 이르기까지, 나는 아직 모른다.
지금까지 IEEE754 사용과 같은 위에서 언급 한 언어 정보에 의존하는 것이 가장 좋습니다.
문제가있는 코드는 경계하는 플레이어를위한 함정으로 남겨 둘 것입니다. 어쩌면 부동 소수점 지식을 가진 사람이 이상한 행동을하는 이유를 설명하는 메모를 남길 수 있습니다 (아무런 추측이 없습니다 :-).
EDIT 2 코드
조각이 플로트에 저장되는 중간체를 확인하여이를 해결. Jonathan Leffler가 옳았음을 알았습니다. 중간 결과였습니다.
#include <stdio.h>
#include <float.h>
int main(void) {
float a = 1;
float b = 0.5;
float c = a + b;
int bits = 1;
while (c != a) {
bits = bits + 1;
b = b/2;
c = a + b;
}
printf("%d\n",FLT_MANT_DIG);
printf("%d\n",bits);
return 0;
}
이 출력 코드 (24, 24)은 계산 된 값이 헤더 파일 일치하는지 표시한다.
C로 작성되었지만 모든 언어 (특히 헤더에서 정보를 사용할 수 없거나 언어 설명서에서 지정했기 때문에)에 적용 할 수 있어야합니다.이클립스가 내 우분투 상자에서 시작될 때까지 오랜 시간이 걸리기 때문에 나는 C로만 테스트했다.
일부 시스템에서는 일부 부동 소수점 유형 (특히 FPU가없는 시스템)을 에뮬레이션합니다. – strager