가장 일반적인 정수는 32 비트이지만 가장 일반적인 부동 소수점 숫자는 64 비트 인 이유는 무엇입니까?

Java 및 C # 배경에서 왔기 때문에 언제든지 int (32 비트)를 사용하는 법을 배웠습니다. 분수 값을 다룰 때는 정수와 double (64 비트)가 필요합니다. 각 프레임 워크 (JVM 및 .NET)의 대부분의 메서드는 일반적으로이 두 가지 유형을 예상합니다.

제 질문은 일관성을 위해 longdouble를 모두 사용하지 않는 이유입니다. 정수에서 64 비트의 정밀도를 갖는 것은 대부분의 경우 필요하지 않다는 것을 알고 있습니다. 그러나 다시 말하지만, 우리는 일반적으로 부동 소수점 숫자에서 64 비트의 정밀도가 필요하지 않습니다. 그렇지 않습니까?

무엇입니까? 그 이유는 무엇입니까?

댓글

  • " 누구나 합리적으로 필요로하는 것에 충분하지만 ' … 사실, 64 비트는 십진수 15 자리를 두 배로합니다. ' 많은 애플리케이션에 적합하지 않습니다 … " ( 왜 float / double이 필요한가요? )
  • C 배경에서 저는 ' 반올림 및 반올림 이후 부동 소수점 숫자에 BigDecimal를 사용하는 방법을 배웠습니다. FP 값을 비교하는 것이 너무 문제가됩니다.
  • @TMN I ' 1/3을 계산하려고 할 때 던지는 유형이 모든 문제에 대한 해결책인지 확실하지 않습니다. .

A nswer

범위 대 정밀도

한 가지는 가장 일반적인 부동 소수점 숫자가 64 비트 DPFP (배정 밀도 부동 소수점) 표현을 사용한다는 생각에 이의를 제기한다는 것입니다.

적어도 성능이 중요한 실수에서는 게임과 같은 시간 필드, SPFP (단 정밀도 부동 소수점)는 여전히 훨씬 더 일반적입니다. 근사치와 속도가 최고의 정확도보다 낫기 때문입니다.

아마도 이것을 보는 한 가지 방법은 32 -bit int2^32 정수 (~ 43 억) 범위를 나타냅니다. 정수의 가장 일반적인 사용은 아마도 요소에 대한 인덱스 일 것입니다. “오늘날 하드웨어에서 사용 가능한 메모리를 초과하지 않으면 초과하기 어려운 매우 건강한 요소 범위입니다 *.

* 30GB의 여유 공간이있는 경우에도 단일 연속 4GB 블록을 할당 / 액세스 할 때 메모리 부족 오류가 발생할 수 있습니다 (예 : 인접성 문제). 해당 블록의 요구 사항입니다.

32 비트 정수는 명령어 수준에서 항상 더 효율적인 것은 아니지만 예를 들어 메모리의 절반이 필요하기 때문에 일반적으로 배열로 집계 할 때 더 효율적입니다 (예 : 단일 페이지 / 캐시 줄에 들어갈 수있는 더 많은 인덱스).

또한 Lightness Races in Orbit는 넓은 관점에서 32 비트 정수가 더 일반적으로 사용된다는 것이 반드시 사실은 아닙니다. 저는 32 비트 ints가 종종 다른 구조에 대한 인덱스로 수십만에서 수백만으로 집계되는 분야에서 내 좁은 관점을 가지고 있습니다. 크기를 절반으로 줄이는 것이 도움이 될 수 있습니다. 많은.

이제 64 비트 DPFP는 일부 상황에서 64 비트 정수보다 훨씬 더 많이 사용될 수 있습니다 . 추가 비트는 범위 가 아닌 정밀도 를 추가합니다. 많은 응용 프로그램은 정밀도를 요구하거나 최소한 추가 정밀도를 사용하여 프로그래밍하는 데 훨씬 더 쉬운 시간을 가질 수 있습니다. 그래서 64 비트 DPFP가 일부 영역에서 64 비트 정수보다 더 일반적 일 수 있고 int가 여전히 32 비트 일 수있는 이유입니다. 64 비트 플랫폼에서도 많은 시나리오에서.

댓글

  • 나는 ' 아이디어에 이의를 제기합니다. 가장 일반적인 통합 데이터 유형은 적어도 오늘날 상용 하드웨어로 작성된 프로그램에서도 32 비트 폭입니다. 64 비트 플랫폼은 현재 널리 퍼져 있습니다.
  • @I ke : 문제는 많은 소프트웨어가 범위가 무엇인지 신경 쓰지 않고 intlong를 사용한다고 생각합니다. 그리고 그러한 소프트웨어는 요즘 두 경우 모두 64 비트 정수를 주로 사용하고 있다고 생각합니다.
  • 흠 저는 정정했습니다. 분명히 int는 일반적으로 여전히 32 비트입니다. , 주로 그런 종류의 코드에 버그가 발생하지 않도록합니다. ' size_t 및 .
  • @LightnessRacesinOrbit 아, 저는 ' 전체 메모리 크기에 대한 우려로 정수를 일부 데이터 구조로 집계하는 코드베이스에서 작업하는 경우가 많기 때문에 극도로 편향되어 있습니다. 최대한 중립적으로 대답하려고 노력했습니다.
  • @I ke : 개인적으로 모든 유형도 명시 적으로 크기를 지정합니다.하지만 당신과 나는 의심 할 여지없이 비정상적입니다. 🙂

Answer

글쎄요, int와 double은 Java입니다. 예를 들어, Objective-C 및 Swift에서는 NSInteger 또는 Int를 사용합니다. 이는 32 비트 컴퓨터에서는 32 비트이고 64 비트 컴퓨터에서는 64 비트입니다. 메모리에있을 수있는 항목 수를 계산할만큼 충분히 큽니다. 확실히 유용한 것은 특정 상황에서 다른 것이 필요하지 않는 한 거의 모든 곳에서 동일한 유형을 사용하는 것입니다.

Java는 모든 구현에서 동일하게 실행되는 코드를 가지려고합니다. 따라서 사용중인 머신과 상관없이 동일한 유형을 사용해야하며 유형은 다음과 독립적 인 동일한 수의 비트를 가져야한다고 생각합니다. 기계. Objective-C와 Swift (그리고 C, C ++도)는 다른 관점을 가지고 있습니다.

정수는 대부분 계산에 사용되며 일반적으로 계산할 항목이 많지 않습니다. 부동 소수점 산술에는 정밀도가 필요하며 32 비트 부동 소수점은 종종 충분한 정밀도를 제공하지 않습니다. 64 비트 double을 모든 곳에서 사용하면 부동 소수점 산술 전문가가 아니어도 항상 충분한 정밀도를 얻을 수 있습니다. float는 그렇지 않습니다.

그러나 long과 double을 사용하면 어떤 일관성이 제공됩니까? 정수와 부동 소수점 숫자는 같은 것이 아닙니다. 일관된 비트 크기를 가질 필요가 없습니다. 2D 포인트를 사용합니다. 일관성을 위해 64 비트 여야하나요? 포인트는 구성 요소 당 32 비트이고 직사각형은 16 비트 여야합니다. 물론 그렇지 않습니다. 일관성이 필요하지 않습니다.

댓글

  • 플랫폼에 관계없이 각 유형의 크기를 동일하게 유지하는 JVM 측면을 설명하는 매우 좋은 답변입니다.

답변

short, int, single 및 double은 32 비트 및 64 비트 플랫폼 및 Java와 같은 C를위한 가장 일반적인 C 컴파일러에서와 같이 Java에서 동일한 크기입니다. int를 주 정수 유형으로, double을 주 부동 소수점 유형으로 간주합니다. 당시 Java가 일반적인 C 컴파일러에서이 규칙을 상속했다고 말하는 것이 합리적이라고 생각합니다.

정수는 일반적으로 c에 사용 ounting 또는 indexing stuff. 20 억 개 이상의 무언가를 세거나 색인을 생성해야하는 경우는 매우 드뭅니다 (전례는 아니지만). 실제로 C99 이전에는 64 비트 정수를 원하는 경우 공급 업체별 유형을 사용해야했습니다.

부동 소수점 숫자는 일반적으로 실수의 근사치로 사용됩니다. 단 정밀도는 충분한 시간 동안 충분하지만 허용 할 수없는 양의 반올림 오류를 발생시키는 문제를 찾는 것은 어렵지 않습니다. 과학 컴퓨팅의 요구가 64 비트 이전에 배정도 부동 소수점 지원이 널리 보급되게 한 원인이 될 것으로 예상합니다. 정수 지원이었습니다.

C는 double 사용을 권장하는 반면 포트란은 단 정밀도 사용을 권장하는 것 같습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다