固定大小的浮点types

stdint.h (C99), boost / cstdint.hpp和cstdint (C ++ 0x)头文件中还有int32_ttypes。

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

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

一些编译器保证floattypes将是IEEE-754 32位二进制格式。 有些不是。 实际上,在大多数非embedded式平台上, float实际上是IEEE-754 singletypes,尽pipe对于一些编译器在更广泛的格式中评估expression式的常见警告也适用。

有一个工作组正在讨论为IEEE-754的2008版本添加C语言绑定,可以考虑build议添加这样的typedef。 如果这被添加到C,我希望C ++标准将最终适合… …。

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

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

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

这样做float32_t是不实际的,因为你通常要使用浮点硬件(如果有的话),而不是回退到软件实现上。

如果你认为像float32_t和float64_t这样的typedef是不可行的,那么你必须习惯于你熟悉的操作系统,编译器,以至于你无法看到你的小巢。

存在本地运行32位IEEE浮点运算的硬件和其他执行64位运算的硬件。 有时候这样的系统甚至不得不和其他人交谈,在这种情况下,知道每个平台上的双倍是32位还是64位是非常重要的。 如果32位平台要根据另一个的64位值做过多的计算,那么我们可能希望根据时序和速度要求来降低精度。

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

目前有一个build议,将以下types添加到语言中:

 decimal32 decimal64 decimal128 

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

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

您可以将float64_t定义为如下的数据types。 float64_t将在32位机器和64位机器上具有64位大小。

 #ifndef FLOAT64 typedef float float64_t; #else typedef double float64_t; #endif