문제

코드에서 버그를 찾으려고 한 시간 후에 나는 마침내 그 이유를 찾았습니다. 나는 아주 작은 플로트를 1F에 추가하려고했지만 아무 일도 일어나지 않았습니다. 왜 그 작은 플로트를 0F에 추가하는 것이 완벽하게 작동한다는 것을 알았습니다.

왜 이런 일이 일어나고 있습니까? 이것은 '순서'와 관련이 있습니까? 이 문제에 대한 해결 방법이 있습니까?

미리 감사드립니다.

편집하다:

이중 정밀 또는 소수점으로 변경하는 것은 현재 옵션이 아닙니다.

도움이 되었습니까?

해결책

단일----------비트 (32 비트) 플로팅-포인트 값의 정밀도는 소수점 이후 약 7 자리이기 때문입니다. 이는 추가하는 값이 적어도 추가 시점에 본질적으로 0임을 의미합니다. 1. 그러나이 값 자체는 지수가 작기 때문에 플로트에 쉽게 저장 될 수 있습니다. 그러나 성공적으로 추가합니다 1 더 많은 수의 지수를 사용해야합니다.

당신이 사용할 수있는 double 더 정밀도가 필요한 경우. 성능 측면에서 이것은 오늘날의 하드웨어에 차이를 만들지 않아야하며 메모리는 종종 모든 단일 변수에 대해 생각해야한다는 제약이 아닙니다.

편집하다: 당신이 말했듯이 그것을 사용합니다 double 사용할 수있는 옵션이 아닙니다 카한 합산, 처럼 Akuhn 의견을 지적했습니다.

또 다른 옵션 float 다시. 그러나 이것은 더 큰 숫자에 아주 적은 숫자를 추가하는 것보다 작업이 몇 개 더있을 때만 도움이됩니다.

다른 팁

플로트의 정밀도 숫자 수는 일정하지만 지수는 분명히 다를 수 있기 때문에 발생할 수 있습니다.

즉, 적은 숫자를 0에 추가 할 수는 있지만 0과 다른 지수를 가진 숫자에 추가 할 수는 없습니다.

당신은 읽어야합니다 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것.

플로팅 포인트 정밀도와 관련이있는 것 같습니다. 내가 당신이라면, 나는 다른 유형을 사용할 것입니다. decimal. 정밀 오류를 해결해야합니다.

와 함께 float, 당신은 단지 만 얻습니다 약 7 자리의 정확도. 그래서 당신의 번호는 1f로 반올림됩니다. 그러한 번호를 저장하려면 사용하십시오 double 대신에

http://msdn.microsoft.com/en-us/library/ayazw934.aspx

허용 된 답변 외에도 : 소수와 큰 수를 요약 해야하는 경우 사용해야합니다. 카한 합산.

성능이 문제 인 경우 (사용할 수 없기 때문에 double), 그 다음에 이진 스케일링/고정점 옵션 일 수 있습니다. floats는 정수로 저장되지만 많은 숫자로 스케일링됩니다 (예 : 2^16). 중간 산술은 (비교적 빠른) 정수 작업으로 수행됩니다. 최종 답변은 스케일링 계수로 나누어 끝에 플로팅 포인트로 다시 변환 할 수 있습니다.

대상 프로세서에 하드웨어 부동 소수점 장치가없는 경우 종종 수행됩니다.

리터럴에 F 접미사를 사용하고있어 두 배가 아닌 수레를 만듭니다. 그래서 당신의 작은 부유물은 더 큰 부유물에서 사라질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top