固定大小的浮点类型

时间:2010-03-26 16:07:46

标签: c++ c boost floating-point

stdint.h(C99),boost/cstdint.hppcstdint(C ++ 0x)标头中,除其他外,还有int32_t类型。

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

这样的东西

4 个答案:

答案 0 :(得分:42)

目前C或C ++标准中没有这样的内容。实际上,甚至根本不保证float将是二进制浮点格式。

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

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

答案 1 :(得分:28)

如果您想知道float是否是IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559。它是一个编译时常量,而不是函数。

如果您想要更加防弹,请检查std::numeric_limits<float>::digits以确保他们不会偷偷使用float的IEEE标准双精度。它应该是24。

说到long double,检查digits更为重要,因为有几种IEEE格式可能是合理的:128位(数字= 113)或80位(数字= 64) )。

使float32_t这样做是不切实际的,因为您通常希望使用浮点硬件(如果可用),而不是依赖于软件实现。

答案 2 :(得分:14)

如果你认为像float32_t和float64_t这样的typedef由于任何原因都是不切实际的,你必须习惯于熟悉的操作系统,编译器,以至于你无法看到你的小窝之外。

存在本机运行32位IEEE浮点运算的硬件和其他运行64位的硬件。有时这样的系统甚至不得不互相交谈,在这种情况下,知道每个平台上的双精度是32位还是64位是非常重要的。如果32位平台基于另一个64位值进行过多计算,我们可能希望根据时序和速度要求转换为较低的精度。

我个人觉得使用浮子和双打感觉很不舒服,除非我确切地知道他们在我的平台上有多少位。如果我通过某些通信渠道将这些转移到另一个平台,那就更是如此。

答案 3 :(得分:3)

目前有一项建议将以下类型添加到语言中:

decimal32
decimal64
decimal128

可能有一天可以通过#include <decimal>访问。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html