고정 크기 부동 소수점 유형


91

에서 stdint.h(C99), 부스트 / cstdint.hpp , 및 cstdint(C + +0)가 헤더, 다른 사람의 사이에서, 유형 int32_t.

비슷한 고정 크기 부동 소수점 유형이 있습니까? 같은 거 float32_t?


4
왜 그런 게 필요한가요?
AraK

40
부동 소수점 값을 가진 데이터 구조가 있고 크기가 정확히 무엇인지 알고 싶을 때 이와 같은 것이 필요합니다.
mob

5
@mobrule : 크기 만 알고 싶다면 sizeof연산자 를 사용하세요 . 이와 같은 유형은 알고리즘이 알려진 특정 크기를 요구할 때 유용합니다.
Stephen Canon

6
@Stephen Canon-예, 크기가 무엇인지 보장하고 싶을 때. 데이터 구조의 인스턴스는 64 비트에 맞고 값으로 일부 외부 라이브러리에 전달할 수 있습니다.
mob

6
@StephenCanon 크로스 플랫폼 직렬화 라이브러리를 고려하십시오. sizeof일관된 마샬링 및 플로팅 유형 마샬링 문제를 해결하는 데 어떻게 사용할 수 있습니까?
Kyle Strand

답변:


47

현재 C 또는 C ++ 표준에는 이와 같은 것이 없습니다. 사실, float이진 부동 소수점 형식이 될 것이라는 보장조차 전혀 없습니다 .

일부 컴파일러는 float유형이 IEEE-754 32 비트 이진 형식 임을 보장 합니다. 일부는 그렇지 않습니다. 실제로, float실제로 IEEE-754 인 single에 유형 가장 넓은 형식으로 식을 평가하는 어떤 컴파일러에 대한 일반적인주의 사항이 적용하지만, 비 임베디드 플랫폼.

2008 년 IEEE-754 개정판에 대한 C 언어 바인딩 추가를 논의하는 작업 그룹이 있으며, 이러한 typedef 추가를 권장 할 수 있습니다. 이것이 C에 추가되면 C ++ 표준이 결국 따라 올 것이라고 예상합니다.


3
IEEE-754 여부에 관계없이 엔디안 이식성 문제를 방지하지 못합니다.
Mark B

1
@Pietro : 언어를 변경해도 하드웨어 호환성에 영향을주지 않으며 일부 하드웨어 만 규정 준수에서 제외됩니다. IEEE FP가 이식성을 어떻게 보장합니까?
Potatoswatter

1
@Potatoswatter : 하드웨어 공급 업체가 규정을 준수하는 솔루션을 제공하도록 권장합니다. 파트 a가 소프트 플로트 라이브러리 해킹없이 표준 C를 지원하고 파트 b가 지원하지 않는 경우 파트 a의 시장 이점입니다.
Stephen Canon

2
@Potatoswatter : (거의) 아무도 하드웨어의 속도에 관심이 없습니다. 우리는 하드웨어에서 실행되는 소프트웨어의 속도에 관심이 있습니다. 실행중인 하드웨어가 표준에 따르고 실행중인 플랫폼에 따라 소프트웨어가 15 개의 다른 특수 사례를 감지하고 패치 할 필요가 없으면 소프트웨어가 더 빠를 수 있습니다.
Stephen Canon

8
코드가 여러 틈새 아키텍처에서 컴파일되는 것을 방지하여 어떻게 더 나은 이식성 을 얻을 수 있습니까? IEEE 인 부동 소수점에 의존합니다.이 경우 코드는 모든 IEEE 호환 구현에서 이미 실행되고 다른 것은 실행되지 않습니다. 그렇지 않으면 코드가 더 넓은 범위의 시스템에서 실행됩니다. C ++이 경우 보장 IEEE 준수, 마법 더 휴대용 얻을 수 없겠죠 코드, 당신은 그냥 수 있다는 것을 배제 것 이제까지 그 비 호환 아키텍처에서 실행됩니다. 당신의 논리는 완전히 거꾸로되어 있습니다.
jalf

30

당신이 당신의 여부를 알고 싶은 경우 float는 IEEE 32 비트 형식입니다 확인 std::numeric_limits<float>::is_iec559. 함수가 아니라 컴파일 타임 상수입니다.

더 방탄하고 싶다면 std::numeric_limits<float>::digits.NET 용 IEEE 표준 배정 밀도를 몰래 사용하지 않는지 확인하십시오 float. 24이어야합니다.

이에 올 때 long double, 그것을 확인하는 것이 더 중요하다 digits128 비트 (숫자 = 113) 또는 80 비트 (숫자 = 64) : 합리적이 될 수있는 몇 IEEE 형식이 있기 때문에.

float32_t일반적으로 사용 가능한 경우 부동 소수점 하드웨어를 사용하고 소프트웨어 구현에 의존하지 않기를 원하기 때문에 그렇게 하는 것은 실용적이지 않습니다.


long doubleOS X (32 비트 및 64 비트 인텔)의 형식을 정확하게 리틀 엔디안 순서로 저장되어있는 IEEE-754 배 확장 된 형식이다. 그것에 대해 전혀 펑키하지 않습니다. 바이트 0-7은 유효 필드를 보유하고 바이트 8 및 9는 지수 및 부호 필드를 보유합니다.
Stephen Canon

@Stephen : 좋은 소식입니다 : v). 내가 게시 한 번호와 일치합니까?
Potatoswatter

1
이중 확장 (다른 754 형식과 달리)에는 명시 적 선행 유효 비트가 있으므로 5.0L유효 숫자가 a000000000000000. 편향되지 않은 지수는 +2이고 이중 확장 지수 편향은 3fff이므로 5.0L에 대한 편향 지수는 4001입니다. 리틀 엔디안 순서로 저장 될 때의 실제 바이트 패턴은 00 00 00 00 00 00 00 a0 01 40입니다. 두 개의 리틀 엔디안 64 비트 정수로 보면 정확히 관찰 한 것을 볼 수 있습니다.
Stephen Canon

(*) 인텔이 하드웨어에서 구현 한대로 두 배 확장, 즉. 이중 확장 형식은 IEEE-754 (1985)의 다른 두 가지 기본 형식과 달리 실제로 고정되어 있지 않습니다.
Stephen Canon

@Stephen : 나는 4001little-endian에서 01 40 00 00 ...다른 것이 없다면 최하위 바이트가 먼저옵니다. 나는 순서가 기대 a0 01 40(그들은 단지 회전을 수행 한 경우) 수 어딘가에 표시하지만 난 왜 설명했다고 생각하지 않습니다 a001 40완전히 분리 된 반쪽에 있습니다.
Potatoswatter

18

어떤 이유로 든 float32_t 및 float64_t와 같은 typedef를 사용하는 것이 비현실적이라고 생각한다면 익숙한 OS, 컴파일러에 너무 익숙해야 작은 둥지 밖을 볼 수 없습니다.

기본적으로 32 비트 IEEE 부동 소수점 연산을 실행하는 하드웨어와 64 비트를 실행하는 다른 하드웨어가 있습니다. 때로는 그러한 시스템이 서로 통신해야하는 경우도 있습니다.이 경우 각 플랫폼에서 double이 32 비트인지 64 비트인지 아는 것이 매우 중요합니다. 32 비트 플랫폼이 다른 64 비트 값을 기반으로 과도한 계산을 수행하는 경우 타이밍 및 속도 요구 사항에 따라 더 낮은 정밀도로 캐스트 할 수 있습니다.

나는 내 플랫폼에 얼마나 많은 비트가 있는지 정확히 알지 못하면 수레와 복식을 사용하는 것이 개인적으로 불편합니다. 일부 통신 채널을 통해 다른 플랫폼으로 전송하려면 더욱 그렇습니다.


"플랫폼에 얼마나 많은 비트가 있는지 정확히 알지 못하면 플로트와 더블을 사용하는 것이 개인적으로 불편 함을 느낍니다. 일부 통신 채널을 통해 다른 플랫폼으로 전송할 경우 더욱 그렇습니다." -텍스트 파일 형식을 사용한다는 뜻입니까? 이것에는 파일 크기의 단점이 있습니다. 32 float에는 4 바이트가 필요합니다. 텍스트 형태의 이러한 ... 단지 네 자리 숫자를 나타낼 수
피에트로

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.