문제

후속 조치에서는 이 질문, 일부 숫자는 부동 소수점으로 전혀 표현할 수 없으며 대신 근사치로 표시되는 것으로 보입니다.

부동 소수점 숫자는 어떻게 저장되나요?

다양한 크기에 대한 공통 표준이 있습니까?

부동 소수점을 사용하는 경우 어떤 종류의 문제에 주의해야 합니까?

언어 간 호환이 가능한가요(즉, TCP/IP를 통해 Python 프로그램에서 C 프로그램으로 부동 소수점 숫자를 보내려면 어떤 변환을 처리해야 합니까)?

-아담

도움이 되었습니까?

해결책

언급한 바와 같이, IEEE 754에 관한 Wikipedia 기사 대부분의 시스템에서 부동 소수점 숫자가 어떻게 저장되는지 잘 보여줍니다.

이제 몇 가지 일반적인 문제는 다음과 같습니다.

  • 가장 큰 점은 두 부동 소수점 숫자의 동등성(또는 불평등)을 비교하고 싶지 않다는 것입니다.대신에 보다 큼/작음 비교를 사용하는 것이 좋습니다.
  • 부동 소수점 숫자에 대해 더 많은 작업을 수행할수록 반올림 오류가 더 커질 수 있습니다.
  • 정밀도는 분수의 크기에 따라 제한되므로 여러 자릿수로 구분된 숫자를 올바르게 추가하지 못할 수도 있습니다.(예를 들어 1E30에 1E-30을 추가할 수 없습니다.)

다른 팁

부동 소수점 숫자와 관련된 문제에 대한 자세한 설명은 기사에 나와 있습니다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항.

표준은 IEEE 754.

물론 IEE754가 충분하지 않을 때 숫자를 저장하는 다른 방법이 있습니다.Java와 같은 라이브러리 BigDecimal 대부분의 플랫폼에서 사용할 수 있으며 SQL의 숫자 유형에 잘 매핑됩니다.무리수에는 기호를 사용할 수 있으며, 이진수나 십진수 부동소수점으로 정확하게 표현할 수 없는 비율은 비율로 저장할 수 있습니다.

질문의 두 번째 부분에 관해서는 프로젝트에 성능과 효율성이 중요하지 않은 한 부동 소수점 데이터를 TCP/IP를 통해 문자열로 전송하는 것이 좋습니다.이를 통해 바이트 정렬과 같은 문제를 방지하고 디버깅을 쉽게 할 수 있습니다.

기본적으로 부동 소수점 숫자에서 걱정해야 할 것은 정밀도 자릿수가 제한되어 있다는 것입니다.이는 동등성을 테스트할 때 또는 프로그램이 실제로 해당 데이터 유형이 제공하는 것보다 더 많은 정밀도를 필요로 하는 경우 문제를 일으킬 수 있습니다.

C++에서 좋은 경험 법칙은 float는 7자리 정밀도를 제공하고 double은 15자리를 제공한다고 생각하는 것입니다.또한 동등성을 테스트하는 방법을 알고 싶다면 다음을 참조하세요. 이것 질문 스레드.

이 질문에 대한 후속 조치에서, 일부 숫자는 플로팅 포인트로 전혀 표현 될 수 없으며 대신 근사치가있는 것으로 보인다.

옳은.

부동 소수점 숫자는 어떻게 저장되나요?다양한 크기에 대한 공통 표준이 있습니까?

다른 포스터가 이미 언급했듯이, 거의 독점적으로 IEEE754와 그 후임자 IEEE754R.인터넷 검색을 하면 비트 패턴 및 설명과 함께 수천 가지 설명이 제공됩니다.여전히 문제가 발생하는 경우 두 가지 일반적인 FP 형식이 있습니다.IBM과 DEC-VAX.일부 난해한 기계 및 컴파일러 (블리츠베이스, 터보 스칼)의 경우 몇 가지 이상한 형식이 있습니다.

부동 소수점을 사용하는 경우 어떤 종류의 문제에 주의해야 합니까?교차 언어와 호환 가능합니까 (즉, Python 프로그램에서 TCP/IP를 통해 C 프로그램으로 부동 소수점 번호를 보내려면 어떤 전환이 필요합니까?)?

실제로는 없으며 언어 간 호환이 가능합니다.

매우 드물게 발생하는 문제:

  • IEEE754는 sNaN(신호를 보내는 NaN) 및 qNaN(quiet NaN)을 정의합니다.전자는 로드된 경우 프로세서가 핸들러 루틴을 호출하도록 강제하는 트랩을 유발합니다.후자는 이것을하지 않습니다.언어 설계자는 sNaN이 작업 흐름을 방해하고 처리기 루틴에 대한 지원을 강제할 수 있는 가능성을 싫어했기 때문에 sNaN은 거의 항상 자동으로 qNaN으로 변환됩니다.따라서 1:1 원시 변환에 의존하지 마십시오.그러나 다시:이것은 매우 드물며 NAN이있는 경우에만 발생합니다.

  • 서로 다른 컴퓨터 간에 파일을 공유하는 경우 엔디안 문제(바이트의 순서가 잘못됨)에 문제가 발생할 수 있습니다.숫자에 대해 NaN을 얻으므로 쉽게 감지할 수 있습니다.

응, 거기 있어 이진 부동 소수점 연산을 위한 IEEE 표준(IEEE 754)

숫자는 이진수로 저장될 때 부호, 지수, 분수의 세 부분으로 나뉩니다.

이것 기사 "IEEE 표준 754 부동 소수점 숫자"라는 제목이 도움이 될 수 있습니다.솔직히 말해서 귀하의 질문을 완전히 이해하고 있는지 확신할 수 없으므로 이것이 도움이 될지는 확신할 수 없지만 도움이 되기를 바랍니다.

부동 소수점 반올림 오류가 정말로 걱정된다면 대부분의 언어는 부동 소수점 오류가 없는 데이터 유형을 제공합니다.SQL Server에는 Decimal 및 Money 데이터 형식이 있습니다..Net에는 Decimal 데이터 유형이 있습니다.Java의 BigDecimal과 같은 무한 정밀도는 아니지만 정의된 소수점 이하 자릿수까지 정확합니다.따라서 $4.58로 입력한 달러 값이 4.579999999999997의 부동 소수점 값으로 저장되는 것에 대해 걱정할 필요가 없습니다.

내가 기억하는 것은 32비트 부동 소수점은 24비트를 실제 숫자로 사용하고 나머지 8비트는 10의 거듭제곱으로 사용되어 소수점 위치를 결정한다는 것입니다.

제가 그 주제에 좀 서툴러서요..

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