固定大小的浮点类型


90

stdint.h(C99),boost / cstdint.hppcstdint(C ++ 0x)标头中,还有type int32_t

是否有类似的固定大小浮点类型?像float32_t什么?


4
为什么需要这样的东西?
AraK

39
当您拥有一个带有浮点值的数据结构并且还想确切知道其大小时,您需要类似的东西。
暴民

5
@mobrule:如果只需要知道大小是多少,可以使用sizeof运算符。当算法要求它是已知的特定大小时,这样的类型将很有用。
斯蒂芬·佳能

6
@Stephen Canon-是的,当您想保证尺寸大小时。假设您的数据结构实例可以容纳64位,并且可以按值传递给某个外部库。
暴民

5
@StephenCanon考虑一个跨平台的序列化库。如何sizeof用于解决一致地编组和解组浮动类型的问题?
凯尔·斯特兰德

Answers:


47

目前,在C或C ++标准中还没有类似的东西。实际上,甚至没有保证float完全是二进制浮点格式。

一些编译器保证float类型为IEEE-754 32位二进制格式。有些没有。实际上,float实际上大多数情况下是IEEE-754 single类型非嵌入式平台,尽管适用某些编译器以较宽格式评估表达式的常见警告。

有一个工作组讨论为IEEE-754的2008年修订版添加C语言绑定,可以考虑建议添加这种typedef。如果将其添加到C中,我希望C ++标准最终会效仿...。


3
不管是否有IEEE-754,它仍然不能防止字节序可移植性问题。
马克B

1
@Pietro:更改语言不会影响您的硬件兼容性,只会使某些硬件无法合规。IEEE FP如何保证可移植性?
Potatoswatter

1
@Potatoswatter:它将鼓励硬件供应商提供合规的解决方案。如果a部分支持标准C而不需要进行软浮动库破解,而b部分则不支持,那么这就是a部分的市场优势。
斯蒂芬·佳能

2
@Potatoswatter:(几乎)没有人关心硬件的速度。我们关心在硬件上运行的软件的速度。如果运行的硬件符合标准,并且该软件不需要根据运行的平台来检测和修补15种不同的特殊情况,则该软件可以更快。
斯蒂芬·佳能

8
通过阻止代码在许多特定领域的架构上进行编译,您将如何在地球上获得更好的可移植性?您要么依赖于浮点数作为IEEE,在这种情况下,您的代码就已经可以在每个符合IEEE的实现上运行,而没有,或者您没有,在这种情况下,您的代码可以在更广泛的系统上运行。如果C ++ 保证 IEEE合规性,您的代码将不会奇迹般地获得更便携,你只是排除它可能曾经对那些不符合标准的架构上运行。您的逻辑完全倒退。
jalf

29

如果您想知道您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 doubleOS X上的(32位和64位Intel)格式是恰好存储在little-endian顺序的IEEE-754双扩展格式。一点都不时髦。字节0-7保留有效字段,字节8和9保留指数字段和符号字段。
斯蒂芬·佳能

@Stephen:好消息:v)。这与我发布的数字一致吗?
Potatoswatter

1
请记住,double扩展名(与其他754格式不同)具有明确的前导有效位,因此5.0L具有的有效位a000000000000000。其无偏指数为+2,双倍扩展指数偏差为3fff,因此5.0L的偏压指数为4001。当以little-endian顺序存储时,实际的字节模式为00 00 00 00 00 00 00 a0 01 40,如果您将其视为两个little-endian 64位整数,则可以看到所观察到的内容。
斯蒂芬·佳能

(*)是英特尔在硬件中实现的两倍扩展。实际上,双重扩展格式并没有像其他两种IEEE-754(1985)基本格式那样固定。
斯蒂芬·佳能

@Stephen:我很确定4001在little-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个浮点数需要4个字节;这些文字形式只能代表一个四位数...
Pietro 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.