固定大小的浮点types
在stdint.h
(C99), boost / cstdint.hpp和cstdint
(C ++ 0x)头文件中还有int32_t
types。
是否有类似的固定大小的浮点types? 像float32_t
?
目前在C或C ++标准中没有这样的东西。 实际上,甚至没有保证float
完全是二进制浮点格式。
一些编译器保证float
types将是IEEE-754 32位二进制格式。 有些不是。 实际上,在大多数非embedded式平台上, float
实际上是IEEE-754 single
types,尽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