在stdint.h
(C99),boost / cstdint.hpp和cstdint
(C ++ 0x)标头中,还有type int32_t
。
是否有类似的固定大小浮点类型?像float32_t
什么?
在stdint.h
(C99),boost / cstdint.hpp和cstdint
(C ++ 0x)标头中,还有type int32_t
。
是否有类似的固定大小浮点类型?像float32_t
什么?
sizeof
运算符。当算法要求它是已知的特定大小时,这样的类型将很有用。
sizeof
用于解决一致地编组和解组浮动类型的问题?
Answers:
目前,在C或C ++标准中还没有类似的东西。实际上,甚至没有保证float
完全是二进制浮点格式。
一些编译器保证float
类型为IEEE-754 32位二进制格式。有些没有。实际上,float
实际上大多数情况下是IEEE-754 single
类型非嵌入式平台,尽管适用某些编译器以较宽格式评估表达式的常见警告。
有一个工作组讨论为IEEE-754的2008年修订版添加C语言绑定,可以考虑建议添加这种typedef。如果将其添加到C中,我希望C ++标准最终会效仿...。
如果您想知道您float
是否为IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559
。它是一个编译时常量,而不是一个函数。
如果您想更防弹,还请检查std::numeric_limits<float>::digits
以确保它们不会偷偷使用IEEE标准double-precision float
。应该是24。
当涉及到时long double
,进行检查更为重要,digits
因为有几种合理的IEEE格式:128位(数字= 113)或80位(数字= 64)。
如此设置是不切实际的,float32_t
因为您通常希望使用浮点硬件(如果有),而又不依赖于软件实现。
long double
OS X上的(32位和64位Intel)格式是恰好存储在little-endian顺序的IEEE-754双扩展格式。一点都不时髦。字节0-7保留有效字段,字节8和9保留指数字段和符号字段。
5.0L
具有的有效位a000000000000000
。其无偏指数为+2,双倍扩展指数偏差为3fff
,因此5.0L的偏压指数为4001
。当以little-endian顺序存储时,实际的字节模式为00 00 00 00 00 00 00 a0 01 40
,如果您将其视为两个little-endian 64位整数,则可以看到所观察到的内容。
4001
在little-endian中是。01 40 00 00 ...
如果没有其他问题,则最低有效字节在前。我确实希望序列a0 01 40
会出现在数字中的某个位置(如果他们仅执行轮换),但是我认为您没有解释原因a0
,01 40
并且完全分开。
如果出于任何原因您认为拥有诸如float32_t和float64_t之类的typedef都是不切实际的,那么您必须对熟悉的OS,编译器过于习惯,以至于无法在小小的巢穴之外看。
存在一些硬件,它们本机运行32位IEEE浮点运算,而其他硬件则执行64位。有时,这样的系统甚至必须互相交谈,在这种情况下,知道每个平台上的double是32位还是64位非常重要。如果32位平台要根据另一个平台的64位值进行过多的计算,则可能需要根据时序和速度要求将其转换为较低的精度。
我个人使用浮点数和双精度数感到不舒服,除非我确切知道它们在平台上有多少位。更重要的是,如果我要通过一些通信渠道将它们转移到另一个平台。
当前,建议将以下类型添加到该语言中:
decimal32
decimal64
decimal128
可能有一天可以通过访问#include <decimal>
。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html